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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание CAD программы с нуля

Создание CAD программы с нуля

Ответ
Поиск в этой теме
Непрочитано 19.11.2013, 00:29 6 |
Создание CAD программы с нуля
zamtmn
 
КИПиА
 
Tyumen
Регистрация: 21.03.2005
Сообщений: 1,559

Всем привет!
В свободное время делаю для себя небольшую CAD программу - всегда было интересно как это работает внутри.
На данный момент есть следующие наработки:
  • Довольно быстрый OpenGL рендеринг чертежа
  • Кроссплатформенность (Windows/Linux, x86/x64, win/gtk/qt)
  • поддержка подмножества DXF версии 2000
  • поддержка SHX, TTF шрифтов
  • поддержка типов линий
  • поддержка примитивов POINT, LINE, CIRCLE, POLYLINE, LWPOLYLINE, ARC, ELLIPSE, INSERT, TEXT, MTEXT, 3DFACE, SOLID, SPLINE, HATCH
  • некоторые потуги автоматизации слаботочных разделов проекта
Cтраничка программы на SourceForge
Cтраничка программы на GitHub
Cтраничка программы на Ohloh

Программа пишется на паскале, компилируется в Lazarus/FPC. Исходный код открыт и лежит в SVN репозитории Git репозитории
Текущую сборку программы можно взять тут, но лучше тут (более менее свежие сборки для Windows_x86 и для Linux_x86_64, другие - стареханькие). Для работы требуется аппаратная поддержка OpenGL на целевом компе
Также программу можно собрать самомтоятельно, для этого понадобятся:
  • релизный Lazarus версии не менее 2.0.10 на базе FPC версии не менее 3.2

Программа не требует установки и не пишет\читает ничего в системные папки (за исключением TEMP) Под windows не допускаются кирилические (и другие) символы в пути к программе (в путях к dxf файлам допускаются), linux версия такой болезнью не страдает.

Любые замечания/предложения приветствуются!

Вложения
Тип файла: zip glu.zip (903.8 Кб, 561 просмотров)


Последний раз редактировалось zamtmn, 09.09.2022 в 20:53.
Просмотров: 209298
 
Автор темы   Непрочитано 15.06.2014, 16:20
#81
zamtmn

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


Спасибо! похоже XP уже не найтешь на рабочих компах))

Для полноты картины мои результаты на Win7x64:
Цитата:
OpenGL driver info: NVIDIA Corporation GeForce GTX 460/PCI/SSE2 4.1.0
Draw 10000 random lines
Canvas: 14msec
GDIPlus: 486msec
AGG: 809msec
OpenGL: 1msec
Цитата:
OpenGL driver info: NVIDIA Corporation GeForce GTX 460/PCI/SSE2 4.1.0
Draw 100000 random lines
Canvas: 134msec
GDIPlus: 4882msec
AGG: 8016msec
OpenGL: 12msec
Более менее можно будет пользоваться только Canvas (т.е. GDI методами). GDIPlus совсем не юзабельно, только в качестве рендера в метафайлы, для экспорта картинок((
zamtmn на форуме  
 
Непрочитано 15.06.2014, 17:13
#82
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,537


zamtmn, займитесь лучше базовым функционалом... Ну и вот еще, команда import... pdf файлы, серьезно? После импортирования dxf2000 в zcad (кстати неправильному) команда arc приводит к фаталу при выборе первой точки...
gomer вне форума  
 
Автор темы   Непрочитано 15.06.2014, 18:02
#83
zamtmn

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


>>zamtmn, займитесь лучше базовым функционалом...
Это самый что нинаесть базовый функционал, хренова что я это дело не предусмотрел когдато давным давно((
В двух словах как устроено сейчас и как планирую:
Сейчас примитивы умеют всё: и рисрваться и выделяться и привязки и трассировки, классы примитивов изза этого очень громоздки и тяжелы для понимания, а нужно еще добавлять расчленение, да мало ли что.
Планирую сделать некую прослойку между примитивом и графической системой. типа как в автокаде примитив объясняет движку как себя рисовать (worddraw или как там его в arx). Вроде как вырисовывается 3 уровня
- первый - база DXF примитивов c методом "worddraw" в котором они обясняют движку как выглядят
- второй "элементарные" примитивы (линии, дуги, фейсы еще чегонибудь) полученые движком из DXF примитивов. На этом уровне работают привязки, трассировки. По информации из этого уровня любой DXF примитив можно расчленить на состовляющие, не реализуя метод explode в классе DXF
- третий - переработка элементарных примитивов с второго уровня в примитивы понятные системе отображения в случае OpenGL - 3d точки, в случае GDI - 2d точки. На этом уровне работает выделение примитивов мышкой.

>>Ну и вот еще, команда import... pdf файлы, серьезно?
Поддержка pdf заявлена библиотекой которую я планировал использовать для импорта (fpvectorial)... но либа не развивается, естественно поддержки pdf пока там нет(( импорт вообще мной не проработан, на данный момент возможно вообще не работает, я им неразу не пользовался
zamtmn на форуме  
 
Непрочитано 23.06.2014, 13:36
#84
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


Про GDI - вспомнил вдруг, есть-же еще Aforge, так их AForge.Imaging.Drawing.Line(...) так-же рисует в Bitmap, но т.к. там требует явного предварительного открытия BitmapData - он по скорости получается чуть быстрее, но главное его можно паралелить на любое количество потоков (как впрочем если и самому написать Брезенхема и писать напрямую в память). А с учетом "реальных" машин - считай скорость вырастет в 2-4 раза.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 23.06.2014, 14:22
#85
zamtmn

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


Aforge - не думаю что это можно просто зацепить к лазарю и использовать в линуксе, ктомуже если это чисто софтовый растеризатор - результаты будут на уровне AGG (он тоже софтовый, растеризует в битмап в памяти) из теста.
>>как впрочем если и самому написать Брезенхема и писать напрямую в память
не, это я делать точно не планирую)) ограничусь набором классов для легкого добавления в зкад любой "конечной рисовалки" и реализую эти рисовалки для GDI, opengl, возможно dx - если от него будет прок по сравнению с opengl на "слабых" компах
zamtmn на форуме  
 
Непрочитано 23.06.2014, 14:28
#86
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,843


Цитата:
Сообщение от zamtmn Посмотреть сообщение
результаты будут на уровне AGG
Не он в один поток по скорости примерно как GDI - в несколько соответственно * на кол-во ядер. Все остальное - тебе видней, я с лазарем не знаком - но формально Aforge это обычный .Net dll.
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 03.07.2014, 11:36
#87
zamtmn

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


В последних SVN комитах появился выбор варианта рендера OpenGL\GDI пока с кучай косяков и не все примитивы умеют через GDI рендериться - но уже понятно что скорость будет аховая((
zamtmn на форуме  
 
Автор темы   Непрочитано 15.07.2014, 23:23
#88
zamtmn

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


Выложил бинарники - 948 ревизия с пробой GDI рендера. снова нужен тест на XP (с классической темой оформления) на предмет наличия мерцания в области отрисовки чертежа - на W7 с классической темой вроде я поборол мерцание, но есть подозрения что в XP они остались(( Перед созданием\загрузкой чертежа нужно в инспекторе на вкладке Рендер в параметре Render backend Выбрать "GDI" иначе будет работать opengl вариант отрисовки
zamtmn на форуме  
 
Непрочитано 16.07.2014, 00:31
#89
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,537


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Выложил бинарники - 948 ревизия с пробой GDI рендера.
Теперь все заново программировать? Часть объектов не отображается, сетка и ручки тоже... Это на семерке
gomer вне форума  
 
Автор темы   Непрочитано 16.07.2014, 00:53
#90
zamtmn

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


>>Часть объектов не отображается, сетка и ручки тоже...
То что не отображается в этот момент пытается отрисовать себя GLными методами на несозданый GLный контекст

>>Теперь все заново программировать?
Не заново конечно, но переделывать нужно очень много, своеобразный глобальный рефакторинг. Особенно тошно становится при взгляде на текстовые примитивы - этож надобыло когдато такой хрени накодить))
Я в архитектуре CAD программ понимаю не много, соответственно развитие зкада это постоянные переделки. Но опенглный рендер будет работать нормально на всем этапе "переделки" и на выходе будет более универсальный и простой код примитивов
zamtmn на форуме  
 
Непрочитано 16.07.2014, 01:13
#91
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,537


осознание собственных заблуждений - это хорошо. Каждый через это проходит. Я так понимаю вы хотите сделать печать из zcad?
gomer вне форума  
 
Автор темы   Непрочитано 16.07.2014, 01:58
#92
zamtmn

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


Зачаток печати в зкаде был и даже работал, правда только в режиме "fit to paper", т.к. функцию подрезки примитивов по рамке печатаемой области выполняли края листа бумаги)), сейчас печать не работает. С "рендерным бакендом" GDI в виндовс печать получится почти автоматически, достаточно (почти достаточно ) будет контекст для рендера создать с принтера, а не с экрана.

>>Я так понимаю вы хотите сделать печать из zcad?
Я давно думал над "мультирендером", но основная подача всетаки некий абстрактный апи для рендера (OpenGL очень специфичен) и упрощение примитивов - вынос "сложных" и вобщемно ненужных чертежному примитиву вещей в отдельный "слой" - набор "низкоуровневыых" графических примитивов.
Мне нужны дуговые сегменты в полилиниях, добавлять их сейчас в примитив - потом замаешся поддерживать (я уже добавил так TTF в текстовые примитивы ), думаю добавить дуги в "низкоуровневые" примитивы будет проще и правильней
zamtmn на форуме  
 
Автор темы   Непрочитано 27.09.2014, 16:19
#93
zamtmn

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


Возник вопрос по анонимным блокам. Могу я их проигнорировать при чтении dxf?
Насколько я понимаю они создаются для примитивов типа размеры, штриховки и т.п. Т.е. содержат в себе внешний вид "составных" автокадовских примитивов. Программа читающая dxf может отобразить размеры и штриховки используя соответствующие анонимные блоки, не заморачиваясь генерацией примитивов на остове стилей. В этом случае я могу их не читать - всеравно поддерживаемые примитивы в зкаде перегенерируются, а не поддерживаемые игнорируются.
Существуют какиенибудь другие сценарии использования анонимных блоков?

Update:
*Aномер это от чего анонимный блок?
По состоянию на сейчас зкад "деанонимизирует" анонимные блоки, после сохранения появляется куча простых блоков вида *Dномер, *Aномер и т.п. и при дальнейшей обработке чертежа в автокаде возможны конфликты имен

Последний раз редактировалось zamtmn, 27.09.2014 в 16:31.
zamtmn на форуме  
 
Непрочитано 27.09.2014, 16:51
#94
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,537


Насколько я понимаю это блоки копирования вставки
gomer вне форума  
 
Автор темы   Непрочитано 27.09.2014, 17:03
#95
zamtmn

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


После вставки вроде A$номер и неанонимный, анонимные начинаются со звездочки

----- добавлено через ~1 ч. -----
провел небольшой эксперимент:
*Dномер - размеры, можно игнорировать, на них есть ссылка только в размерном примитиве, уна у меня не обрабатывается
*Aномер - штриховки, возможно что то еще, вроде можно игнорировать, штриховки пока неподдерживаются
*Uномер - непонятно что, если юзать всякие экзотические стрелки на концах размерных примитивах, то в блоках этих стрелок появляются ссылки на анонимные блоки такого вида
zamtmn на форуме  
 
Автор темы   Непрочитано 30.09.2014, 20:06
#96
zamtmn

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


Цитата:
Сообщение от gomer Посмотреть сообщение
zamtmn, не нужно менять геометрию по каждому чиху в инспекторе
Не прошло и полгода, всвязи с забагованностью инспектора он помаленьку довольно сильно переписался)) Теперь чихи пропускаются, изменения комитятся к примитивам по нажатию ентера и потере фокуса.
zamtmn на форуме  
 
Автор темы   Непрочитано 03.11.2014, 16:21
#97
zamtmn

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


Выложил версию 1045. В ней еще доработал инспектор объектов, теперь он рисуется в соответствии с системными настройками - всякие подсветки при наведении мышки и прочие плюшки.

update:
Проверил работу на win xp, 7, 8. висты у меня нет, поэтому буду благодарен если кто выложит скриншот с висты

Последний раз редактировалось zamtmn, 03.11.2014 в 17:00.
zamtmn на форуме  
 
Автор темы   Непрочитано 16.11.2014, 00:06
#98
zamtmn

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


Как оказалось старый инспектор больше по душе большинству пользователей, в том числе и мне - сделал возможность отката к старой версии и еще немного настроек.
Выглядит примерно так:

Сейчас ломаю голову как проще сделать возможность множественной обработки примитивов в инспекторе и уйти от "физического" представления примитивов в инспекторе к более дружественному к пользователю
zamtmn на форуме  
 
Непрочитано 16.11.2014, 22:37
#99
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,537


zamtmn, не заморачивайтесь на таком, не стоит оно того, лучше пилите размеры, а еще атрибуты в блока и спецсимволы в тексте
gomer вне форума  
 
Автор темы   Непрочитано 16.11.2014, 23:04
#100
zamtmn

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


Инспектор вообще получился самой кровопьющей запчастью, незнаю что на меня нашло - обычно на внешний вид глубоко пофиг))
>>а еще атрибуты в блока и спецсимволы в тексте
Спецсимволы в тексте основные есть, что добавить?
Атрибуты тоже есть, но своеобразные)). Любому примитиву можно присвоить набор типизированных "переменных", а для устройств можно прилепить текст\мтекст в "динамическую" часть и организовать отображение этих "переменных" в любой комбинации на чертеже. Совместимо с автокадом только в одну сторону (только отобразить, в автокаде не создать), но ИМХО гораздо мощьнее чем обычные атрибуты.
Про размеры пока промолчу, уж больно они в автокаде замарочистые
zamtmn на форуме  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание CAD программы с нуля

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск