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

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

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

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

Всем привет!
В свободное время делаю для себя небольшую 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 версия такой болезнью не страдает.

Для запуска доступны следующие ключи командной строки:
  • NLL - отключение загрузки файла докинга окон, окна открываются непристыкованными, но докинг работает
  • SI - полное отключение докинга, зкад работает в однооконном режиме (очень недоделанном)
  • UPDATEPO - отключение закрузки локализации, будет запущена английская версия. Также в этом режиме доступна команда обновления файлов локализации
  • NOSPLASH - отключение показа окна загрузки
  • путь/к/файлу.dxf - открыть указанный файл

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

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


Последний раз редактировалось zamtmn, 08.06.2022 в 00:17.
Просмотров: 181091
 
Непрочитано 22.12.2021, 20:37
#421
basilcat


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


Там и защита в dcu шке.�� Ну никакая. ��
Ладно, не такие города брали.
Смотрю тут один программист на сях делал, эскиз даёт

https://coderoad.ru/1000785/%D0%97%D...BB%D0%BE%D0%B2


Код:
[Выделить все]
     private void ReadDxfFile (string DxfFile)
{
    string Layer = "";

    string[] D = DxfFile.Split(new[] { Environment.NewLine }, StringSplitOptions.None);

    int iEntities = 0; for(int i = 0; i < D.Length; i++) { if (D[i] == "ENTITIES") {iEntities = i; break; } }
    for (int i = iEntities; i < D.Length; i++)
    {
        if (D[i] == "POINT" || D[i] == "AcDbPoint")
        {
            int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; }
            Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == "  8") { Layer = D[iLayer + 1]; }; }
            for (int iWaarden = i; iWaarden < i + 8; iWaarden++)
            {
                if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20")
                {
                    //Here you can store the following data in a list for later use
                    //LayerName = Layer
                    //X = D[iWaarden + 1]
                    //Y = D[iWaarden + 3]
                    //Z = D[iWaarden + 5]
                }
            }
        }

        if (D[i] == "LINE" || D[i] == "AcDbLine")
        {
            int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; }
            Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == "  8") { Layer = D[iLayer + 1]; }; }
            for (int iWaarden = i; iWaarden < i + 10; iWaarden++)
            {
                if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20")
                {
                    //Here you can store the following data in a list for later use
                    //LayerName = Layer
                    //Xbegin = D[iWaarden + 1]
                    //Ybegin = D[iWaarden + 3]
                    //Zbegin = D[iWaarden + 5]
                    //Xend = D[iWaarden + 7]
                    //Yend = D[iWaarden + 9]
                    //Zend = D[iWaarden + 11]
                }
            }
        }

        if (D[i] == "ARC" || D[i] == "AcDbArc" || D[i] == "AcDbCircle")
        {
            int iEntity = i; if (D[i].StartsWith("AcDb")) { for (iEntity = i; D[iEntity] != "AcDbEntity"; iEntity--) ; }
            Layer = ""; for (int iLayer = iEntity; iLayer < i + 10 && Layer == ""; iLayer++) { if (D[iLayer] == "  8") { Layer = D[iLayer + 1]; }; }
            for (int iWaarden = i; iWaarden < i + 10; iWaarden++)
            {
                if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20" && D[iWaarden + 10] == " 51")
                {
                    //Here you can store the following data in a list for later use
                    //LayerName = Layer
                    //Xmid = D[iWaarden + 1]
                    //Ymid = D[iWaarden + 3]
                    //Zmid = D[iWaarden + 5]
                    //Radius = D[iWaarden + 7]
                    //StartAngle = D[iWaarden + 9]
                    //StartAngle = D[iWaarden + 11]
                }
                if (D[iWaarden] == " 10" && D[iWaarden + 2] == " 20" && D[iWaarden + 12] == " 51")
                {
                    //Here you can store the following data in a list for later use
                    //LayerName = Layer
                    //Xmid = D[iWaarden + 1]
                    //Ymid = D[iWaarden + 3]
                    //Zmid = D[iWaarden + 5]
                    //Radius = D[iWaarden + 7]
                    //StartAngle = D[iWaarden + 11]
                    //StartAngle = D[iWaarden + 13]
                }
            }
        }

    }
}
Время покажет.

А есть ещё и dll сишная по чтению из Solidworks 2001 портировал в Delphi и читал этот формат dxf. С него всё и началось.

Последний раз редактировалось Кулик Алексей aka kpblc, 22.12.2021 в 21:48.
basilcat вне форума  
 
Автор темы   Непрочитано 22.12.2021, 20:45
#422
zamtmn

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


>>Смотрю тут один программист на сях делал, эскиз даёт
нет, это не серьезно
zamtmn вне форума  
 
Непрочитано 22.12.2021, 20:49
#423
basilcat


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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
>>Смотрю тут один программист на сях делал, эскиз даёт
нет, это не серьезно
Я ещё не смотрел.
basilcat вне форума  
 
Автор темы   Непрочитано 22.12.2021, 20:52
#424
zamtmn

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


https://github.com/skalogryz/dxf проскакивало недавно на freepascal.ru не проверял
zamtmn вне форума  
 
Непрочитано 22.12.2021, 21:36
#425
basilcat


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


Следующий шаг - работа на линукс.
Стоит ubunty в виртуалке с Лазарем, здесь заработает нормально потащу туда. Платформонезависимое только так. Я уже понял.

Спасибо за ссылку. Гляну.
basilcat вне форума  
 
Автор темы   Непрочитано 22.12.2021, 22:05
#426
zamtmn

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


Можешь попробовать использовать zcad, как в прямом виде - написав команды реализующие нужный функционал, так и в виде библиотеки реализующей чтение\отображение dxf
Пример второго варианта: https://github.com/zamtmn/zcad/tree/...urce/simplecad там с сборкой стольких заморочек нет, просто компиль и запускай

update:
хотя вру. некоторые пакеты simplecad требует
zamtmn вне форума  
 
Непрочитано 22.12.2021, 22:48
#427
basilcat


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


По первой ссылке Solidworks 2001 читает сносно.
basilcat вне форума  
 
Автор темы   Непрочитано 03.02.2022, 14:24
#428
zamtmn

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


В тестовом режиме прикрутил "ночные" сборки
https://ci.appveyor.com/project/zamt...uild/artifacts

----- добавлено через 51 сек. -----
пока только win32
zamtmn вне форума  
 
Автор темы   Непрочитано 27.03.2022, 01:37
#429
zamtmn

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


Навигаторы из https://forum.dwg.ru/showpost.php?p=...&postcount=385 (раньше называл их инспекторами) прокачались и последнее время стали чуть ли не основным инструментом работы.
Появилась возможность фильтрации наполнения дерева, возможность сохранять-загружать настройки навигаторов и быстро между ними переключаться
Миниатюры
Нажмите на изображение для увеличения
Название: navigator.png
Просмотров: 104
Размер:	63.6 Кб
ID:	246245  

Последний раз редактировалось zamtmn, 27.03.2022 в 01:44.
zamtmn вне форума  
 
Автор темы   Непрочитано 20.05.2022, 11:29
#430
zamtmn

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


Пробую ковырнуть штриховки. Встречались кому алгоритмы векторной заливки?
zamtmn вне форума  
 
Автор темы   Непрочитано 08.06.2022, 00:14
#431
zamtmn

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


Появилась начальная поддержка штриховок
https://imgur.com/a/OXpmGua
zamtmn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание CAD программы с нуля

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

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