Доступ к dxf на VLisp

Автор: | 05.02.2018

Введение
Формат DXF-файла
Считывание данных из DXF-файла
Запись данных в DXF-файл

Введение

Данные о чертеже обычно сохраняются в файле с расширением .dwg. Также можно сохранить чертеж в файле с расширением .dxf. Формат DXF по своей структуре похож на формат DWG, но более простой для понимания, поскольку основан на тексте ASCII.

Формат DXF был создан как универсальный формат, который поддерживается практически всеми CAD-системами и используется для CAM (англ. Computer-aided manufacturing) – подготовки технологического процесса производства изделий, ориентированной на использование ЭВМ. Данные чертежа AutoCAD передаются на станок с ЧПУ для плоской обработки детали или заготовки – 2D-фрезерование, лазерная резка и гравировка и пр. Технология такого процесса обычно следующая:

  • модель или контуры (в CAD программе);
  • траектория и параметры инструмента (в САМ программе);
  • управляющая программа для станка.

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

Чертеж, который передается CAM программе, должен быть соответствующим образом обработан. Удаляются лишние элементы, такие как рамка, надписи, размеры. Все объекты должны быть созданы сплошной линией (CONTINIOUS). Если вы создадите отрезок пунктирной линией, то станок и вырежет ее с зазорами. Отметим, что выполнение этих пунктов совсем не является обязательным, в каждом случае нужно руководствоваться требованиями CAM-программы, ее возможностями анализа данных.

Обработка чертежей может быть связана не только с технологическими процессами. Так, например, до сих пор актуальна проблема векторизации растрового изображения (перевод bmp, jpeg или gif в формат dxf). Ниже приведены ряд задач по распознаванию геометрических фигур на основе данных DXF-файла. Они позволяют понять специфику обработки графических данных. Для решения этих задач, прежде всего, необходимо ознакомиться с форматом DXF-файла, а также определить, как считывать из него необходимые данные.

Формат DXF-файла

Для ознакомления с форматом DXF-файла выполните следующие действия:

  1. Загрузите AutoCAD, начните новый чертёж, выбрав прототип Acadiso.dwt.
  2. Начертите два примитива – отрезок (команда LINE) и окружность (CIRCLE).
  3. Сохраните чертёж, выделив в диалоговом окне тип файла AutoCAD2013 DXF (имя чертежа, например – ddxf)
  4. Загрузите VisualLISP редактор и откройте в нём сохранённый dxf-файл.
  5. Найдите в DXF-файле слово ENTITIES

  1. Ознакомьтесь со структурой описания примитивов (ENTITIES) в DXF-файле.
  2. Измените какие-либо параметры примитивов в DXF- файле, например – координаты точек или значение радиуса. Запомните модифицированный DXF-файл, активизируйте редактор AutoCAD и откройте в нём этот файл. Если Вы правильно изменили параметры примитивов (не перепутали идентификаторы с параметрами), тогда на экране появится чертёж с изменёнными параметрами примитивов. В противном случае появится сообщение об ошибке.

DXF-файл разделён на секции, каждая из которых начинается с заголовка, например, HEADER (Руководящая секция), CLASSES (Классы), TABLES (Таблицы), BLOCKS (Блоки), ENTITIES (Примитивы), OBJECTS (Объекты).

DXF-файл состоит из последовательности пар строк. Первая строка пары является идентификатором (маркером); вторая – значением соответствующего маркеру параметра. Например, после идентификатора » 40″ идет значение радиуса, а после идентификатора » 10″ значение координаты X центра окружности, или начальной точки отрезка.

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

Каждый примитив представляется в файле только одним из возможных способов его описания – независимо от способа его определения (опции). Например, отрезок всегда описывается в файле координатами вершин. Окружность представляется в DXF-файле координатами центра и радиусом.

Считывание данных из DXF-файла

Получить данные про примитивы можно двумя способами:

  1. Построчным (или посимвольным) считыванием данных из файла;
  2. С помощью специальных функций AutoLISP доступа к примитивам.

Ниже рассмотрен первый способ. Этим способом обеспечивается считывание информации из файла практически на любом языке программирования.

Ниже приведена программа на языке VLISP создания в AutoCAD примитивов чертежа (отрезка и окружности) по данным, считываемых из DXF-файла. Программа построена в соответствии со структурой описания примитивов в DXF-файле.

Ознакомьтесь с содержанием программы и запустите ее. При необходимости модифицируйте программу. Например, в случае использования DXF-файлов от разных версий AutoCAD, количество впустую считываемых функцией repeat  строк после нахождения строки  LINE (CIRCLE) различны.

Файл Rdxf.lsp

(defun C:rf()
(setq f (open "E:/tmp/d1.dxf" "r"))
(setq str (read-line f))
(while (/= str "EOF")
(if (= str "LINE") (progn
(repeat 11 (read-line f) )
(setq XF (atof (read-line f))) (read-line f)
(setq YF (atof (read-line f))) (read-line f)
(setq ZF (atof (read-line f))) (read-line f)
(setq XT (atof (read-line f))) (read-line f)
(setq YT (atof (read-line f))) (read-line f)
(setq ZT (atof (read-line f)))
(setq PF (list XF YF ZF))
(setq PT (list XT YT ZT))
(command "LINE" PF PT "")
)
(if (= str "CIRCLE") (progn
(repeat 11 (read-line f) )
(setq X (atof (read-line f))) (read-line f)
(setq Y (atof (read-line f))) (read-line f)
(setq Z (atof (read-line f))) (read-line f)
(setq R (atof (read-line f)))
(setq C (list X Y Z))
(command "CIRCLE" C R)
)
)
)
(setq str (read-line f))
)
(close f)
)

Открывается файл для чтения. Считывается 1я строка. Организуется цикл построчного считывания данных, пока не будет достигнут конец файла. EOF – последняя строка DXF-файла. Строки с идентификаторами или с неиспользуемыми атрибутами считываются без запоминания. Одиннадцать строк после строки LINE (CIRCLE) не используются (считываются без запоминания). Используемые параметры запоминаются в переменных. Функция progn объединяет в блок входящие функции. Функция atof преобразует текстовую переменную в вещественное число.

Задание: Модифицируйте программу, обеспечив создание в AutoCAD примитивов чертежа (отрезка, окружности и дуги) по данным, считываемым из DXF-файла.

Запись данных в DXF-файл

При решении ряда расчётных задач часто возникает необходимость закончить решение задачи построением рисунка. Функция Command даёт такую возможность. Однако есть альтернативное решение – непосредственное создание DXF-файла рисунка. Такой метод моделирования изображений позволяет более рационально использовать компьютерные ресурсы. К тому же, он может быть удобнее, например, для создания поверхностей неправильной формы с помощью сетей из граней. Ниже приводится программа создания DXF-файла (файл a.dxf), в котором содержится описание одного примитива – окружности. Программа одновременно обеспечивает импортирование DXF-файла в текущий рисунок. Ознакомьтесь с содержанием программы и запустите ее.

Файл Wdxf.lsp

(defun C:crdxf ()
(setq X (getreal "\ninput X <3.0>: "))
(setq Y (getreal "\ninput Y <4.0>: "))
(setq R (getreal "\ninput R <1.0>: "))
(if (= X nil) (setq X 3.0) X)
(if (= Y nil) (setq Y 4.0) Y)
(if (= R nil) (setq R 1.0) R)
(setq f (open "E:/tmp/a.dxf" "w"))
(write-line "  0" f)
(write-line "SECTION" f)
(write-line "  2" f)
(write-line "ENTITIES" f)
(write-line " 0" f)
(write-line "CIRCLE" f)
(write-line " 8" f)
(write-line "0" f)
(write-line " 10" f)
(princ X f)
(write-line "\n 20" f)
(princ Y f)
(write-line "\n 30" f)
(write-line "0.0" f)
(write-line " 40" f)
(princ R f)
(write-line "\n  0" f)
(write-line "ENDSEC" f)
(write-line "  0" f)
(write-line "EOF" f)
(close f)
(command "DXFIN" "E:/tmp/a")
)

Функция writeline записывает в файл текстовую переменную и переходит на следующую строку. Функция princ записывает в файл значение переменной. Переход на следующую строку обеспечивается управляющим символом \n.

Контрольное задание. Модифицируйте программу, обеспечив создание DXF-файла, в котором описывается рисунок из окружности и отрезка.

 

Автор: Николай Свирневский

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *