Форум программистов, компьютерный форум, киберфорум
Lazarus
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
17 / 16 / 9
Регистрация: 20.09.2013
Сообщений: 66
1

Программное создание DXF-файлов

26.12.2015, 19:03. Просмотров 6628. Ответов 18
Метки нет (Все метки)

Здравствуйте!
Всех с наступающим Новым годом!!!

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

DXF-формат - это один из самых популярных форматов векторной графики. Его понимают практически все CAD-системы, всевозможные ГИС и САПР. Это его первый большой плюс. А второй плюс DXF-формата - это то, что он текстовый и достаточно хорошо задокументирован (в отличие, например, от распространенных, но закрытых форматов DGN и DWG), а значит - с ним можно работать программно без всяких сторонних библиотек.

Однажды у меня возникла необходимость видеть результаты расчётов своей программы в наглядном графическом виде. Пришлось разобраться с DXF-форматом, и написать свои процедуры, облегчающие создание DXF-файла.
Все эти процедуры собрал в отдельный модуль "unit_dxf.pas" - есть в прилагаемом архиве.
Ну а для примера сделал маленький проект, создающий пару тестовых DXF-файлов.
Как выглядят эти тестовые DXF-файлы - показано на прилагаемых картинках.

Чтобы успешно использовать предлагаемые инструменты, полезно кое-что знать о DXF-формате.

DXF-файл - это текстовый файл, организованный определенным образом.

Если открыть DXF-файл в "Блокноте", можно увидеть, что:
DXF-файл состоит из множества групп, каждая из которых занимает две строки. В первой строке размещается код группы (положительное целое число), а вторая строка группы представляет собой значение группы, имеющее формат, зависящий от кода группы. То есть, минимальный кирпичик, из которых строится DXF-файл, состоит из ПАРЫ строк. (Но в это, в принципе, можно и не вникать - просто интересно для общего развития).

DXF-файл состоит из "шапки" и нескольких разделов (некоторые из которых могут и отсутствовать). Раздел заголовка (HEADER), раздел таблиц (TABLES), раздел блоков (BLOCKS), раздел графических примитивов (ENTITIES). Начало и конец всех разделов отмечаются в DXF-файле специальными группами.


Принцип создания DXF-файла при помощи модуля "unit_dxf.pas":

Сначала процедура "Write_DXF_Header" открывает новый DXF-файл (текстовый) и записывает в него необходимую "минимальную" шапку (её строки описаны как константы в этом же модуле), включая признак начала раздела графических примитиов.
Затем записываем в DXF-файл всю необходимую нам графику при помощи ряда процедур, создающих такие элементы: Поли-линия (ломаная), квадрат, прямоугольник, круг, отрезок, текст.
И затем завершаем создание DXF-файла процедурой "Write_DXF_End" (она пишет в файл признак конца раздела графических примитивов и признак конца DXF-файла, и закрывает его текстовый файл).

Среди всех графических примитивов, особенность имеет поли-линия. Она имеет свою "шапку" (записывается в файл процедурой "Write_POLYLINE_Header"), затем перечень вертексов, т.е. угловых точек ломаной (записываются последовательно процедурой "Write_DXF_Vertex"), и признак конца поли-линии (записывается в файл процедурой "Write_POLYLINE_End"). Нельзя забывать об этом порядке при записи в файл (иначе будет нарушение формата, и DXF-файл может не считываться различными программами).

Вот, собственно, и всё.
Пример создания DXF-файлов показан в прилагаемом проекте.

P.S.:
Детальное описание DXF-формата можно найти в Интернете (например, на сайте компании Autodesk)
http://docs.autodesk.com/ACD/2... 9-796c.htm
3
Миниатюры
Программное создание DXF-файлов   Программное создание DXF-файлов   Программное создание DXF-файлов  

Вложения
Тип файла: rar project_WriteDxf.rar (129.1 Кб, 121 просмотров)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2015, 19:03
Ответы с готовыми решениями:

Программное создание события
Здравствуйте =) Допустим, я создаю, во время работы программы, кнопку, как мне этой созданной...

Программное создание форм
Добрый день. Пишу достаточно большое приложение - эмулятор настольной игры и попутно осваиваю...

Программное создание элемента формы
Создаю элемент с помощью процедуры. procedure TForm1.ComboCreate(i: Integer; name: string); begin...

Lazarus программное создание файла
Мне нужно при нажатии кнопки создать TMemo который объединён в GroupBox.Помогите плиз:help:

18
610 / 650 / 122
Регистрация: 10.08.2015
Сообщений: 2,836
27.12.2015, 17:38 2
Цитата Сообщение от BarsikCat Посмотреть сообщение
DXF-файл - это текстовый файл, организованный определенным образом.
Читал-читал и так и не увидел о dxf какой версии идет речь...
dxf - файлы, созданные программой из вложения не открываются автокадом 2014
Неизвестная группа 74 в таблице в строке 64.
Испорченный или неполный входной DXF-файл -- импорт чертежа не выполнен.
Впрочем брикскад нормально открывает эти файлы.
Так что еще есть над чем работать. Удачи в ваших начинаниях.
Если есть желание поищите программу zcad - это cad, написанный на Lazarus. Исходные коды открыты. Он работает с форматом dxf2000
1
17 / 16 / 9
Регистрация: 20.09.2013
Сообщений: 66
27.12.2015, 18:26  [ТС] 3
vlisp, спасибо за тестирование в Автокаде. У меня его, к сожалению, нет; смотрю на свои DXF-ы исключительно при помощи MicroStation_v8.
На основании приведенного Вами сообщения "неизвестная группа..." изменил модуль (убрал из шапки лишнее - фрагмент, содержащий эту группу 74). То есть, теперь у создаваемых dxf-файлов шапка стала короче на 20 с лишним строк, чем было раньше.
Итак, у меня новые DXF-файлы, разумеется, открываются. Ну а если и Вы еще разок проверите в Автокаде - буду признателен.
(новый архив с проектом прилагается)
0
Вложения
Тип файла: rar project_WriteDxf_(004).rar (128.7 Кб, 69 просмотров)
17 / 16 / 9
Регистрация: 20.09.2013
Сообщений: 66
27.12.2015, 19:13  [ТС] 4
Добавлю немножко.
Конечно, о формате DXF я знаю, наверное, всего 1-2% того, что можно о нём знать))
И тем не менее, таких скромных познаний хватает для того, чтобы программно формировать простейшие (но вполне подходящие для моих задач) DXF-файлы. Естественно, эти "самодельные" DXF-файлы не содержат огромного количества атрибутов и параметров, которые присутствуют в "настоящих" DXF-файлах, сгенерированных Автокадом или другими CAD-системами.

Чтобы оценить, сколько всего хранится в "настоящих" DXF-файлах, можно в том же МикроСтэйшне или Автокаде создать новый проект и нарисовать в нем одну-единственную линию, и сохранить это дело в DXF-формате: весить полученный файл будет несколько десятков Килобайт, хотя собственно графики в нём - сущий пустяк.

(Поэтому, кстати, хорошую читалку для DXF-файлов пока так и не сделал - это несколько труднее, чем формирование файлов по небольшому набору правил. Но работу в данном направлении медленно веду, когда время позволяет...)
0
610 / 650 / 122
Регистрация: 10.08.2015
Сообщений: 2,836
27.12.2015, 21:46 5
Цитата Сообщение от BarsikCat Посмотреть сообщение
Итак, у меня новые DXF-файлы, разумеется, открываются.
А у меня нет. Теперь такая ошибка:
Неопределенный код группы 370 для объекта в строке 104.
Испорченный или неполный входной DXF-файл -- импорт чертежа не выполнен.
1
17 / 16 / 9
Регистрация: 20.09.2013
Сообщений: 66
27.12.2015, 22:27  [ТС] 6
Цитата Сообщение от vlisp Посмотреть сообщение
Теперь такая ошибка...
жалко тратить Ваше время дальше. (Группа 370 задает толщину линии, но вот почему на неё ругается...)
С Автокадом, значит, такие файлы пока не дружат. Постараюсь разобраться почему.
Спасибо!
0
610 / 650 / 122
Регистрация: 10.08.2015
Сообщений: 2,836
27.12.2015, 23:06 7
Цитата Сообщение от BarsikCat Посмотреть сообщение
Группа 370 задает толщину линии, но вот почему на неё ругается...
Возможно потому, что в этой версии еще не было толщин линий как таковых
0
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 2
01.07.2016, 12:00 8
если кому интересны - мои наработки работы с DXF.
в принципе намутил уже для себя много всего (проектирую электрику/электроснабжение): расчет и построение молниезащиты, генератор спецификаций, генератор однолинейных схема, расчет выбора кабелей.
все результаты генерю в dxf, чтобы потом вставлять в автокад.
0
0 / 0 / 0
Регистрация: 01.07.2016
Сообщений: 2
01.07.2016, 12:02 9
чтото никак не разберусь как файлы прилеплять
0
Вложения
Тип файла: zip работа с DXF.zip (5.5 Кб, 63 просмотров)
2 / 2 / 1
Регистрация: 19.02.2017
Сообщений: 43
19.02.2017, 21:08 10
А когда вертекс - это дуга, которая задаётся тангенсом. Никто с таким не сталкивался? И как его рассчитать?
0
610 / 650 / 122
Регистрация: 10.08.2015
Сообщений: 2,836
19.02.2017, 22:40 11
Цитата Сообщение от ДАОС_ Посмотреть сообщение
когда вертекс - это дуга
вертекс - это вершина, она не может быть дугой! Криволинейные участки полилиний описываются величиной кривизны, которая добавляется после описания вершины... вот здесь глянь https://habrahabr.ru/post/301484/
0
2 / 2 / 1
Регистрация: 19.02.2017
Сообщений: 43
19.02.2017, 22:47 12
да, там видел. Спасиб. Нашёл в другом месте b=h/(k/2); b-кривизна k-хорда h-высота дуги, дальше найти радиус и его координаты, это уже не проблема.
0
0 / 0 / 0
Регистрация: 06.09.2017
Сообщений: 2
06.09.2017, 21:47 13
Цитата Сообщение от physieker Посмотреть сообщение
если кому интересны - мои наработки работы с DXF.
в принципе намутил уже для себя много всего (проектирую электрику/электроснабжение): расчет и построение молниезащиты, генератор спецификаций, генератор однолинейных схема, расчет выбора кабелей.
все результаты генерю в dxf, чтобы потом вставлять в автокад.
Привет, давай спишемся <cut> Я тоже инженер по электроснабжению и мне нужно научиться формировать dxf файлы в автокаде
0
2 / 2 / 1
Регистрация: 19.02.2017
Сообщений: 43
09.09.2017, 18:45 14
to physieker
Виталий, а OFFSET к полилинии не пробовали строить?
0
354 / 154 / 39
Регистрация: 11.07.2013
Сообщений: 828
10.09.2017, 07:08 15
Полилиния "LWPOLYLINE". Количество вершин (90), описанных в файле. Флаг центровки (70): 0 – последнюю вершину не связывать с первой, 1 – добавить вершину с такими же координатами, как у первой.
Название: Безымянный.png
Просмотров: 174

Размер: 1.9 Кб
Координаты вершин по X, Y, Z (10, 20, 30).
А вообще наиболее сложные фигуры - это сплайны и элиптические окружности (дуги).

А приходилось ли кому разбираться, как хранятся в DXF-файле 3D фигуры?
0
0 / 0 / 0
Регистрация: 12.04.2018
Сообщений: 1
12.04.2018, 15:31 16
Гляньте там 3DFACE
Пример работы:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var DXFcanvas:tDXFcanvas;
    p1,p2,p3,p4:tPointE;
begin
  DXFcanvas:= tDXFcanvas.Create(Strings(['ZVV']));
  DXFcanvas.Layer:= 'ZVV';
  DXFcanvas.TextColor:= dxfRed;
  DXFcanvas.TextSize:= 30;
  DXFcanvas.BrushColor:= dxfSilver;
  p1:=PointE(0,0);
  p2:=PointE(1,0);
  p3:=PointE(1,1);
  p4:=PointE(0,0);
         DXFcanvas.Quadrangle(p1,p2,p3,p4);
  DXFcanvas.Save(ExtractFilePath(Application.ExeName)+'test1.dxf');
end;
  tVertex = record
    X: extended;
    Y: extended;
    Z: extended;
  End;
  TPointE = record
    X: extended;
    Y: extended;
  end;
0
Вложения
Тип файла: rar DXF.rar (3.1 Кб, 34 просмотров)
0 / 0 / 0
Регистрация: 20.07.2020
Сообщений: 2
20.07.2020, 22:27 17
BarsikCat,
Добрый день,
Обращаюсь к вам как к специалисту который работает с dxf.
У меня на работе зада стоит сделать программу которая будет при загрузке файла dfx считать длинну резки лазера и точки врезки.

Насколько я понимаю для вас это задача простая, может вы уже такое делали.

Можете помочь. Готов заплатить за решение данного вопроса.
Поможете???
0
17 / 16 / 9
Регистрация: 20.09.2013
Сообщений: 66
20.07.2020, 23:36  [ТС] 18
добрый вечер!
торможу наверное: как тут в личку написать? или почту свою сообщите...
1
0 / 0 / 0
Регистрация: 20.07.2020
Сообщений: 2
20.07.2020, 23:44 19
[del]
напишите свой номер в почте я вам позвоню завтра и расскажу подробнее задачу.
 Комментарий модератора 
Правила форума, п. 4.6
Обсуждение вопросов - только в теме на форуме. Приглашения к обсуждению еще где-либо (в том числе и с помощью системы личных сообщений) запрещены, за исключением коммерческих разделов.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.07.2020, 23:44

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

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

Кривая Безье и DXF-файл
Здравствуйте! В DXF-файле (AutoCAD) для постороения кривой Безье хранятся координаты узлов и...

Создание dxf файлов в результате распознавания - дайте нубу совет
Здравствуйте! Вопрос не к пользователям автокада, а скорее к программистам, а возможно и вообще...

Создание DXF в С++Builder6
Кто нибудь в билдере работал с DXF. Суть проблемы! Как создать новый DXF. C чего начать? Может...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.