Экспорт в DXF из своего ПО
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Экспорт в DXF из своего ПО

Экспорт в DXF из своего ПО

Ответ
Поиск в этой теме
Непрочитано 16.08.2013, 11:07 #1
Экспорт в DXF из своего ПО
Аркос
 
Регистрация: 18.09.2012
Сообщений: 23

Доброго всем времени суток.

Встал простейший до выноса мозга вопрос.

Есть тестовый dxf-файл, созданый своей программкой.
Автокад его кушать отказывается, в то время как стороннее ПО ест за милую душу.
А разгадка одна, полагаю, - handle/point'ы со всеми их словарями и т.п.
Код:
[Выделить все]
0
SECTION
2
ENTITIES
0
LINE
8
0
10
5
20
10
30
0
11
105
21
60
31
0
0
LINE
8
0
10
5
20
60
30
0
11
105
21
10
31
0
0
LINE
8
0
10
55
20
10
30
0
11
55
21
60
31
0
0
LINE
8
0
10
5
20
35
30
0
11
105
21
35
31
0
0
LWPOLYLINE
8
0
90
4
38
3135
10
5
20
10
40
0.2
41
0.5
42
-0.15
10
105
20
10
40
0.1
41
0.1
42
0
10
105
20
60
40
0.1
41
0.1
42
0
10
5
20
60
40
0.1
41
0.1
42
0
0
ENDSEC
0
EOF

Причём если выкинуть из него lwpolyline, то AutoCAD его тоже съест.

Подскажите, люди добрые, что делать.



В целом стоит задача импорта/экспорта простейших примитивов - линий (line, lwpoly, poly3d), дуг(circle,arc,ellipse), 3dface и текста.
Т.е. весь dxf с блоками, реакторами, словарями и пр. на текущий момент не представляет интереса.

К сообщению прикреплён файл, прогонка которого осуществляется через "импорт-экспорт" - с помощью чего и был получен тестовый файл.


--------------------------------------------

На седьмой странице поиска нашлось-таки что-то вразумительное:
http://forum.dwg.ru/printthread.php?t=54876&pp=1000
Цитата:
Сообщение от zamtmn
если опустить все секции, оставмв только ENTITIES - автокад будет считать что это DXF12, соответственно будет ругаться на все примитивы не входящие в этот формат. IMAGE не в курсе, а LWPOLYLINE вроде появился только с DXF2000. Соответственно либо используй POLYLINE, либо пиши полноценный DXF2000, но там многое не опустить
В т.ч. там писано:
Цитата:
Сообщение от Штурман
использовать подставной пустой файл, но это крайний вариант.
А чем он крайний?


Успех определённый достигнут.
Не воспринимаются пока блоки, shape'ы и пр.

Актуальный вопрос - layout'ы - листы.
Что, как, почему?

Вложения
Тип файла: dwg 1.dxf.dwg (218.8 Кб, 5141 просмотров)
Тип файла: dwg 1.dxf.dxf.dwg (14.8 Кб, 5112 просмотров)


Последний раз редактировалось Аркос, 11.09.2013 в 09:32. Причина: Прикрепление dxf не прокатило, не заметил.
Просмотров: 13553
 
Непрочитано 16.08.2013, 14:08
#2
Олег (jr.)

специалист по околачиванию грушевых деревьев
 
Регистрация: 14.09.2004
Pietari, Venäjä
Сообщений: 811


Посмотри здесь:
http://www.codeproject.com/Articles/...D-Format-Files
Олег (jr.) вне форума  
 
Непрочитано 16.08.2013, 16:33
#3
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


>>А чем он крайний?
Ничем не крайний. Нормальный вариант. Но даже в нем имеется куча заморочек - dxf хорошо документированный формат для чтения, с записью всё довольно расплывчато((
zamtmn вне форума  
 
Непрочитано 16.08.2013, 17:12
#4
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
dxf хорошо документированный формат для чтения, с записью всё довольно расплывчато((
Это как? Формат документа (в данном случае DXF) либо хорошо документирован, либо плохо. Нет отдельно "формата для записи" или "формата для чтения"
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 16.08.2013, 18:21
#5
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Цитата:
Это как?
Вот так. Прочитать уже сформированный файл по мануалу легко. Сформировать с нуля dxf>=2000 c парой стилей линий, текста, несколькими блоками - не выйдет (в смысле автокад его валидным не посчитает), много "белых" пятен, которые придется выяснять эксперементальным путем
zamtmn вне форума  
 
Непрочитано 16.08.2013, 18:54
#6
trir


 
Регистрация: 18.12.2010
Сообщений: 5,107


Нет
Цитата:
100
Subclass marker (AcDbPolyline)
http://www.autodesk.com/techpubs/aut.../dxf/index.htm

Код:
[Выделить все]
  0
LWPOLYLINE
  5
57B5
330
1F
100
AcDbEntity
  8
0
100
AcDbPolyline
 90
        6
 70
   128
 43
0.0
 10
370807.5526267851
 20
311130.9854127853
 10
371315.6103796044
 20
311360.0925125328
 10
370790.0671416614
 20
311414.4571016569
 10
370473.3812355983
 20
311252.3342995942
 10
370528.7525048581
 20
311510.5656245229
 10
370725.9531298396
 20
311523.1858064944
trir вне форума  
 
Непрочитано 16.08.2013, 18:59
#7
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Вот так. Прочитать уже сформированный файл по мануалу легко. Сформировать с нуля dxf>=2000 c парой стилей линий, текста, несколькими блоками - не выйдет (в смысле автокад его валидным не посчитает), много "белых" пятен, которые придется выяснять эксперементальным путем
Я не работал с DXF, поскольку мне (к счастью) это не требовалось. Здесь DXF спецификации от Autodesk. Т.е. хотите сказать, что на практике обозначенные спецификации не являются полными?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 16.08.2013, 19:50
#8
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Почему, они являются полными)) Всё расписано по отдельности, но когда начинаешь всё это увязывать вместе - общая структура файла не очень понятна, что на что ссылается не ясно. А в документации по этому поводу сухие строки, например:
Цитата:
340-349:Hard-pointer handle; arbitrary hard pointers to other objects within same DXF file or drawing. Translated during INSERT and XREF operations
Также в автокаде не радует обработка ошибок в чертежах - либо вылет с невнятным асертом, либо самый "любимый" вариант - неработает копирование в клипбоард. Вот и разбирайся где накосячил. Клоны в таких случаях более информативны
zamtmn вне форума  
 
Непрочитано 16.08.2013, 20:00
#9
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
когда начинаешь всё это увязывать вместе - общая структура файла не очень понятна
Как-то не густо книг по теме... Единственное что нашёл, имеющее отношение к DXF, но применительно к некому Vectorworks (но в оглавлении там какая-то ахинея).
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 16.08.2013, 20:28
#10
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Всё что мне попадалось в свободном доступе находится на уровне
Цитата:
0
SECTION
2
ENTITIES
.....
.....

0
ENDSEC
0
EOF
Хочешь большего - покупай закрытую либу. Правда я интересовался этим очень давно.
dxf хоть и называется "обменным", но его структура повторяет внутренние "автокадовские" структуры данных, что очень плохо для "универсального" стандарта

Последний раз редактировалось zamtmn, 16.08.2013 в 20:35.
zamtmn вне форума  
 
Автор темы   Непрочитано 16.08.2013, 21:34
#11
Аркос


 
Регистрация: 18.09.2012
Сообщений: 23


Цитата:
Сообщение от zamtmn Посмотреть сообщение
в нем имеется куча заморочек - dxf хорошо документированный формат для чтения, с записью всё довольно расплывчато((
Полностью согласен. К тому же стороннее ПО, которому dxf довольно часто скармливается, прекрасно понимает любые кастрированные от указательного мусора формы.
А вот у автокада
Цитата:
Сообщение от zamtmn Посмотреть сообщение
много "белых" пятен, которые придется выяснять эксперементальным путем
hwd, любое стороннее ПО не имеет особого смысла рассматривать. Подходы сильно отличаются - кроме ACAD'а никому нет дела до его указателей. Видимо, это просто бессмысленная коммерческая уловка.
К тому же наши файлы должны читаться автокадом на стороне заказчика.

P.S. trir, вот и попробуй скорми это CAD'у А потом расскажи, откуда взялись значения по индексам 5 и 330.
Олег (jr.), тема - экспорт. Чтение интересует крайне мало - с ним проблем не бывало пока. Плюс, умеющий писать - читать сумеет

--------------------------

На текущий момент был взят более-менее кастрированный вариант от стороннего ПО, которое хорошо дружит с acad'ом.
Читаемость acad'ом стала 100%. Но итого пара тысяч лишних строк в файле. (раз в 10 меньше, чем "пустой" dxf от самого acad'а)
Может, кто-то может предложить ещё более "чистые" (короткие) варианты?

Как альтернатива, есть ли ещё более удобные способы передачи данных из/в CAD, кроме dxf?
(сам CAD на рабочей машине отсутствует, работа сугубо по подгрузке нужных данных, собственной обработке и выгрузке в читаемый формат)

Последний раз редактировалось Аркос, 16.08.2013 в 21:39. Причина: дополнение
Аркос вне форума  
 
Непрочитано 16.08.2013, 21:38
#12
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Аркос Посмотреть сообщение
Может, кто-то может предложить ещё более "чистые" (короткие) варианты?
Вспомнился один мой старый фокус, который проделывал ещё в 9-14 автокадах... А текстовые данные для передачи должны быть обязательно в формате DXF? Приложения из которых\в которые производится экспорт\импорт, оба умеют выполнять код, написанный на AutoLISP?
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Автор темы   Непрочитано 16.08.2013, 21:43
#13
Аркос


 
Регистрация: 18.09.2012
Сообщений: 23


Цитата:
Сообщение от hwd Посмотреть сообщение
А текстовые данные для передачи должны быть обязательно в формате DXF?
Нет. Просто первый пришедший в голову и на практике опробованный способ.
Как-никак довольно открытый формат с хорошей документацией на чтение.

Цитата:
Сообщение от hwd Посмотреть сообщение
Приложения из которых\в которые производится экспорт\импорт, оба умеют выполнять код, написанный на AutoLISP?
Нет. Своё - самописное. Умеет только то, чему сами научим.
Если есть предложения, как можно обучить autolisp'у - с удовольствием почитаю.
Аркос вне форума  
 
Непрочитано 16.08.2013, 21:55
#14
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от Аркос Посмотреть сообщение
Нет. Своё - самописное. Умеет только то, чему сами научим.
Жаль. Во времена DOS'овских версий AutoCAD, когда файлы передавались дискетами и каждый байт был на счету, я сжимал чертежи, программно генерируя исходный LISP код, воссоздающий содержимое этих чертежей. Поскольку исходный код имел текстовый формат, то такой файл сжимался весьма сильно (в отличие от DWG файла), как минимим на порядок. На сжатый файл ставил пароль, если требовалось. Т.о. там, где у других на дискету едва помещался один файл, у меня помещалось 4-5 файлов. В то время это была охренительная экономия. Причём сам LISP код, генерировавший мой LISP файл, был прост до безобразия. Сейчас под рукой нет справочника Полещука, но насколько я помню, в AutoLISP есть команда, называется entmake, которая на основе заданного списка пар воссоздаёт примитив. Т.е. к примеру, при помощи (entget(car(entsel))) получаешь список, удаляешь из него идентификаторы (так же программно) и результат подсовываешь entmake в качестве параметра. Ну и такую команду генерируешь для каждого примитива. Получается текстовый файл исходника LISP, который сжимаешь архиватором. В своё время эта штука у меня в универе (конец 90-х) была очень востребована. Вот подумал, может быть тебе можно было бы по похожему пути пойти. Реализация проста как пять копеек, даже несмотря на то, что я лисп уже не помню лет адцать, но думаю что смог бы вспомнить при желании. Тем более с этим могут справиться те, кто на лиспе пишет сейчас.

Попробовал, что-то получилось: Например, в чертеже есть линия, упрощённо (на пальцах) получаем её коды так:
Код:
[Выделить все]
 (entget(car(entsel)))
Результат видим такой:
Цитата:
((-1 . <Entity name: 7ffffb03ef0>) (0 . "LINE") (330 . <Entity
name: 7ffffb03e50>) (5 . "6F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8
. "0") (100 . "AcDbLine") (10 131.285 80.6143 0.0) (11 175.784 110.461 0.0)
(210 0.0 0.0 1.0))
Отрезаем лишнее и формируем команду создания этой линии:
Код:
[Выделить все]
 (entmake '((0 . "LINE") (5 . "6F") (100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 
. "0") (100 . "AcDbLine") (10 131.285 80.6143 0.0) (11 175.784 110.461 0.0) 
(210 0.0 0.0 1.0)))
Теперь, если эту команду запустить - в чертеже будет создана та самая линия. Ну и все остальные примитивы по аналогии. Генерируешь текстовый файл с такими командами в своей программе и затем спокойно запускаешь его в AutoCAD на исполнение.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 16.08.2013 в 22:56.
hwd вне форума  
 
Автор темы   Непрочитано 16.08.2013, 22:09
#15
Аркос


 
Регистрация: 18.09.2012
Сообщений: 23


Цитата:
Сообщение от hwd Посмотреть сообщение
Реализация проста как пять копеек.
Хм... идея неплохая. Осталось придумать, как автоматизировать запуск скрипта, а так же добавить нужные размерные стили и пр.
Боюсь, что это будет в разы сложнее. Если бы не текстовые и т.п. стили... а так придётся устроить фабрику из несвязанных приложений, одно из которых не планируется покупать
или нанять бригаду телепатов для обучения заказчика хитростям исполнения appload. (т.к. стили и т.п. можно задать через (COMMAND "_...")

Говоря проще, решение хорошее. Жаль, что не для нашего случая.

P.S. к тому же, самые "тяжёлые" файлы наверняка в итоге будут "открываться" в разы медленнее, чем из "готового" файла. А некоторые наши файлы даже в cad'е открывались за полминуты...


Опишу ситуацию подробнее.
Есть наше рабочее место (ПК), на котором нет acad'а. На него приходят исходные данные в dxf из acad'а. Нужно эти данные считать, обработать в своём ПО и отдать в dxf, который бы понял acad на стороне заказчика.
С acad'ом напрямую взаимодействовать никак нельзя. Его просто нет. Ни dll, ни plugin, ни autolisp. Если только их можно косвенно задействовать на стороне заказчика, где, для упрощения, сидит "бабушка", которая понимает только "двойной клик - открыть", не больше.\

acad ------> наше ПО, нет acad'а ------> acad
При условии максимально неумных обезьян на обоих концах (дуракоустойчивость).

pps. с entmake entupd и пр. - знаком.

----------------------------

Где-то на форуме читал, что файл dxf-файл пополнялся нужными данными "в блокноте" следующим образом:
находился максимальный указатель под индексом "5", к нему прибавлось для запаса 50 и дальше новые данные шли с указателем i+1.
Под "330" там же всегда ставили 1F.

Кто-нибудь имел подобный опыт? Всегда ли прокатывало?

Последний раз редактировалось Аркос, 16.08.2013 в 22:16. Причина: правка для ответа на правку hwd
Аркос вне форума  
 
Непрочитано 16.08.2013, 22:10
#16
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


подправил предыдущее своё сообщение, добавив простой пример.
Цитата:
Осталось придумать, как автоматизировать запуск скрипта, а так же добавить нужные размерные стили и пр.
Это-то как раз и не сложно.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:
hwd вне форума  
 
Непрочитано 16.08.2013, 22:19
#17
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Аркос
>>Может, кто-то может предложить ещё более "чистые" (короткие) варианты?
а смысл гонки за укорачиванием? Имхо лучше лделать "универсально" чтоб можно было вписывать что надо и в короткие-сторонние и в длинные-"родные". да еще и любых версий.
>>Может, кто-то может предложить ещё более "чистые" (короткие) варианты?
dwg?
hwd
>>то такой файл сжимался весьма сильно (в отличие от DWG файла)
Думаю только за счет того что в нем было фактически гораздо меньше информации чем в dwg. Старые dwg были очень экономными, впрочем и сейчас "координатная" информация там хранится очень компактно, со множеством хитростей для экономии места. Это не нынешние xml))
zamtmn вне форума  
 
Автор темы   Непрочитано 16.08.2013, 22:20
#18
Аркос


 
Регистрация: 18.09.2012
Сообщений: 23


Цитата:
Сообщение от Аркос Посмотреть сообщение
acad ------> наше ПО, нет acad'а ------> acad
При условии максимально неумных обезьян на обоих концах (дуракоустойчивость).
Дополнил пояснения схемкой =)
Цитата:
Сообщение от hwd Посмотреть сообщение
Цитата:
Сообщение от Аркос Посмотреть сообщение
Осталось придумать, как автоматизировать запуск скрипта, а так же добавить нужные размерные стили и пр.
Это-то как раз и не сложно.
Я в cad'е уверенный пользователь и начинающий lisp'ер. Не более. И полагаю, что на стороне, принимающей мои файлы, будут ещё менее гибкие пользователи. И слать им .lsp и объяснять что к чему не получится.

Цитата:
Сообщение от zamtmn
а смысл гонки за укорачиванием?
Сугубо в целях читаемости и компактности.
В любом случае уже были выиграны полметра и пара десятков тысяч строк. Думаю, дальше уже не критично.
Ориентировка же идёт на 2004 в целях совеместимости со старыми версиями.

Последний раз редактировалось Аркос, 16.08.2013 в 22:25. Причина: ответ zamtmn
Аркос вне форума  
 
Непрочитано 16.08.2013, 22:28
#19
hwd

C, C++, C#
 
Регистрация: 07.10.2009
С-Пб.
Сообщений: 2,762
Отправить сообщение для hwd с помощью Skype™


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Думаю только за счет того что в нем было фактически гораздо меньше информации чем в dwg.
Нет, как раз таки за счёт того, что любой текстовый файл сжимается гораздо лучше чем двоичный. Генерируемый мною LISP файл по объёму получался в 3-5 раз больше, чем исходный DWG файл, однако после сжатия архиватором лисп в итоге по объёму получался чуть ли на порядок меньше.
Цитата:
Сообщение от zamtmn Посмотреть сообщение
Старые dwg были очень экономными
Хрен там! Как раз таки старые DWG сжимались гораздо хуже, чем современные. Во всяком случае, насколько я помню, старый DWG не всегда сжимался даже в 2 раза, из-за этого и пришлось такого коня изобретать, ибо дискеты стоили денег и часто дохли, особенно в метро.
Цитата:
Сообщение от Аркос
И полагаю, что на стороне, принимающей мои файлы, будут ещё менее гибкие пользователи. И слать им .lsp и объяснять что к чему не получится.
Если всё время ориентироваться на дураков, то коммунизм построить не удастся. Файл не обязательно должен иметь расширение LSP, можно задать и SCR, однако один хрен - всё равно придётся дёрнуть команду (load "бла-бла"), или appload или script.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome:

Последний раз редактировалось hwd, 16.08.2013 в 22:38.
hwd вне форума  
 
Непрочитано 16.08.2013, 22:33
#20
zamtmn

КИПиА
 
Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
<phrase 1=


Аркос
>>Сугубо в целях читаемости и компактности.
думаю самым верным вариантом будет найти гденибудь старенький autocad2000\2004 БЕЗ ВСЯКИХ СТОРОННИХ НАШЛЕПОК и записать файлы в нем
hwd
>>Генерируемый мною LISP файл по объёму получался в 3-5 раз больше
я думаю он всяко не содержал всего того что есть в dwg, а только то что нужно. вот за счет этого и выигрышь.
zamtmn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Экспорт в DXF из своего ПО



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ищу коллег-пользователей TEKLA PiP Tekla 6018 27.08.2015 16:13
LISP. Пакетный экспорт настроек слоев TararykovDG Готовые программы 4 03.04.2012 10:03
Подскажите - экспорт файла в Tekla 15 Ozzz Tekla 1 10.03.2010 14:07
Экспорт спецификации из MechaniCS 4.5 в OpenOffice TAL ПО от CSoft 2 28.03.2007 20:18