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

Вернуться   Форум 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.
Просмотров: 209280
 
Автор темы   Непрочитано 26.11.2013, 23:27
#41
zamtmn

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


>>Другое дело что было бы свободное время, можно было бы попробовать сделать универсальную прогу для создания расчетных схем и просмотра результатов...
Мое свободное время уходит на ковыряние в "движке" зкада, такчто могу только помогать в этом нелегком деле))
>>Пока ничего добавлять не надо, я сейчас под автокадом работаю...
Я не тороплюсь чтото добавить, по большому счету меня всё устраивает как есть. Но прекрасно понимаю что делая для себя в итоге хорошего будет мало - с себя взятки гладки - правильность и красота приносится в жерту скорости и простоте((.
Например сплошь и рядом в в зкаде одни и теже вещи делаются разными способами - сейчас я думаю так лучше, год назад думал по другому, а 2 года назад вообще не думал)) Нужно все перерабатывать-стандартизовывать и описывать.
Пожалуй попробую тут спросить совета:
Одна из частей зкада менеджер команд, самый простой способ расширения возможностей программы - написание новой команды и регистрация их в менеджере, тогда она становится доступной для пользователя из интерфейса.
В простейшем случае (без интерактивности) команда это просто функция которой передается выполнение в момент ввода ее имени пользователем в комстроку или нажатия соответствующей кнопки интерфейса. Регистрация такой команды происходит с помощью процедуры:
Код:
[Выделить все]
function CreateCommandFastObjectPlugin(ocs:ComFuncWithOper;name:pansichar;SA,DA:TCStartAttr):pCommandFastObjectPlugin;
ocs-адрес функции
name-имя команды
SA,DA-соответственно атрибуты разрешения и запрещения выполнения команды
например команда SelectAll - выбор всех примитивов в чертеже регистрируется так:
Код:
[Выделить все]
CreateCommandFastObjectPlugin(@SelectAll_com,'SelectAll',CADWG,0);
т.е. в исходниках имя процедуры - SelectAll_com, в интерфейсе она будет доступна по имени SelectAll, для своего выполнения она требует наличия открытого чертежа и ничто ее не может запретить.

Пока для атрибутов разрешения\запрещения определена только константа
Код:
[Выделить все]
const
     CADWG=1;
при указании ее при регистрации зкад соответственно разрешит выполнение команды только при наличии открытого чертежа, сюда также сразу просится наличие выбраных примитивов, чтобы например при указании (CADWG or CASelEntsPresent) команда могла запуститься только при наличии выбранных примитивов.
Это все для минимизации внутренних проверок внутри команд, какие еще ситуации тут стоит предусмотреть?
Также думаю при регистрации надо добавить атрибут "прозрачного выполнения" - например при черчении полилинии вызов команды UNDO не должен отменять команду черчения, только последний сегмент полилинии, а вызов команды LINE должен отменить черчение полилинии и чертить линию.
Возможно стоит при регистрации также указать какие действия выполнять по завершению команды, например отменить выбор примитивов или оставить их выбранными для следующей команды, перерисовать чертеж или нет

----- добавлено через ~24 ч. -----
Еще более интересная ситуация с "интерактивными" командами, когда требуется указание координат мышкой. Сейчас это классы со своими обработчиками OnMouseClick, OnKeyPress и т.п. Очень сложно и громоздко, собственно по этому и сделано всего несколько команд черчения.
Гораздо удобнее это иметь в виде:
Код:
[Выделить все]
Procedure DrawLine;
...
p1=GetPoint();
p2=GetPoint();
CreateLine(p1,p2);
...
от пользователя получены 2 точки и создана линия.
Но с этой GetPoint большая проблема - видимо придется внутри нее крутить свой цикл обработки сообщений помимо Application.Run и неочень понятно как быть если пользователь во время ее выполнения захочет потыкать в другие элементы управления - последовательность выполнения нарушится.

Также неясно как в этом случае быть с резиновыми примитивами, которые тянутя за мышкой, если для примера выше еще можно выкрутится
Код:
[Выделить все]
Procedure DrawLine;
...
p1=GetPoint();
p2=GetPointAndDrawLineTo(p1);
CreateLine(p1,p2);
...
то на все случаи жизни "резиновые" функции получения координат не напишешь(( нужно в GetPoint както отдавать информацию о том какие примитивы по каким законам тянуть за мышью. Как этот вопрос решается в автокаде?
zamtmn вне форума  
 
Автор темы   Непрочитано 28.11.2013, 11:00
#42
zamtmn

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


GetPoint реализовать получилось, ближайшее время сделаю модуль с несколькими хорошо документироваными командами для интерактивного черчения

----- добавлено через ~11 ч. -----
добавил обещаный модуль
http://svn.shamangrad.net/zcad/trunk...ndsexample.pas
команда создания выровненного размера, пока без "резиновости"
zamtmn вне форума  
 
Автор темы   Непрочитано 29.11.2013, 23:31
#43
zamtmn

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


Интерфейс "интерактивности" устаканился.
Код:
[Выделить все]
function Get3DPoint(prompt:GDBString;out p:GDBVertex):GDBBoolean;
function Get3DPointInteractive(prompt:GDBString;out p:GDBVertex;const InteractiveProc:TInteractiveProcObjBuild;const PInteractiveData:GDBPointer):GDBBoolean;
Get3DPoint - простое ожидание точки указаной пользователем (мышкой или клавой), возвращает true если всё прошло нормально и указанные координаты будут лежать в параметре p. Если вернулся false - команда была отменена (нажат еск, запущена другая команда), в параметре p при этом будет лежать мусор.

Get3DPointInteractive - тоже самое, но с "резиновыми" возможностями. при перемещении мышки будет вызываться подпрограмма указанная в параметре InteractiveProc, ей будет переданы координаты мыши, состояние левой кнопки и PInteractiveData который может указывать на любые пользовательские данные, например на примитив который надо тянуть за мышкой. InteractiveProc должна быть объявлена так:
Код:
[Выделить все]
procedure(const PInteractiveData:GDBPointer;Point:GDBVertex;Click:GDBBoolean);
PInteractiveData - указатель на пользовательские данные, Point - положение мышки, Click - состояние левой кнопки мышки.
например если в Get3DPointInteractive передать такую процедуру
Код:
[Выделить все]
procedure InteractiveLineManipulator(const PInteractiveData:GDBPointer;Point:GDBVertex;Click:GDBBoolean);
begin
     PGDBObjLine(PInteractiveData)^.CoordInOCS.lEnd:=Point;
     PGDBObjLine(PInteractiveData)^.FormatEntity(gdb.GetCurrentDWG^);
end;
то линия указанная в PInteractiveData быдет таскаться концом за мышкой.

По сути это получились теже классы с onMouseMove и onMouseClick, но реализованные в процедурах. Проще "резиновость" имхо не сделать
zamtmn вне форума  
 
Непрочитано 30.11.2013, 08:46
#44
Pum-purum

PHP-разработчик
 
Регистрация: 12.05.2008
Ижевск
Сообщений: 1,167


zamtmn, как происходит процесс программирования? Где вы набираете код? Что за язык? Могу ли я вам чем-то помочь?)
Pum-purum вне форума  
 
Непрочитано 30.11.2013, 10:29
#45
hexD

КМД
 
Регистрация: 26.03.2013
Я ЖЫВУ В РОССИИ.
Сообщений: 511
<phrase 1=


вот здесь в сорцах есть крутая программка, предел возможностей любителя-одиночки...
http://www.cs.technion.ac.il/~gershon/GuIrit/
hexD вне форума  
 
Автор темы   Непрочитано 30.11.2013, 11:43
#46
zamtmn

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


Pum-purum
Пишу в Lazarus, это IDE для freepascal. То что нужно и ссылки где взять - перечислены в первом посте. Помочь можно, даже нужно - написанием чего либо, тестиванием или просто высказав пожеланья-замечания

hexD
Да, по видео - чтото серъезное. Но сырцы я ненашел, и не совсем в тему - 3D моделирования я не касаюсь

Последний раз редактировалось zamtmn, 30.11.2013 в 11:55.
zamtmn вне форума  
 
Непрочитано 30.11.2013, 14:45
#47
gomer

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


Цитата:
Сообщение от hexD Посмотреть сообщение
вот здесь в сорцах есть крутая программка, предел возможностей любителя-одиночки...
У этой программки серьезный 3D движок, разрабатывавшийся не одним поколением студентов я так думаю, а сама она - лишь фантик для этого движка
zamtmn, можете INSERT реализовать?
gomer вне форума  
 
Автор темы   Непрочитано 30.11.2013, 14:55
#48
zamtmn

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


>>можете INSERT реализовать?
Что конкретно?
INSERT есть, но он сделан чуток по другому - без коментариев и сплошь и рядом одному мне понятные "магические" заклинания)).
Вынести и оформить с коментариями?
zamtmn вне форума  
 
Непрочитано 30.11.2013, 20:49
#49
gomer

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


Цитата:
Сообщение от zamtmn Посмотреть сообщение
Что конкретно?
Я имел ввиду вставку блоков из внешних файлов с помощью диалогового окна или хотя бы через ком. строку
gomer вне форума  
 
Непрочитано 30.11.2013, 20:58
#50
hexD

КМД
 
Регистрация: 26.03.2013
Я ЖЫВУ В РОССИИ.
Сообщений: 511
<phrase 1=


Цитата:
Сообщение от gomer Посмотреть сообщение
У этой программки серьезный 3D движок, разрабатывавшийся не одним поколением студентов я так думаю,
студенты и серъезный движок вещи несовместимые ) я.т.д., там профессор шибко вумный, и имхо это его детище...но ктож его знает...особенно впечатляют возможности различных интерактивных(гуй) трансформаций, поковыряв гуй поглубже не стану называть его фантиком, тоже чья то немалая работа...жаль что на лысом С,(а не на асме ))) ), но как грится для случая энтузиазма - то что доктор прописал...
hexD вне форума  
 
Автор темы   Непрочитано 30.11.2013, 21:22
#51
zamtmn

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


>>Я имел ввиду вставку блоков из внешних файлов с помощью диалогового окна или хотя бы через ком. строку
Это можно, даже можно сказать тоже есть - в пустой чертеж теже ОПСные извещатели вставляются из внешних файлов. Вот предпросмотр вставляемых блоков пока хз с какой стороны подходить
zamtmn вне форума  
 
Автор темы   Непрочитано 02.12.2013, 01:48
#52
zamtmn

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


переделал "примерную" команду создания выровненного размера - добавил "резиновость"
http://svn.shamangrad.net/zcad/trunk...ndsexample.pas

Сейчас надо аналогичную Get3DPoint процедуру для выбора примитивов
Миниатюры
Нажмите на изображение для увеличения
Название: dimaligned.gif
Просмотров: 211
Размер:	110.8 Кб
ID:	117690  
zamtmn вне форума  
 
Автор темы   Непрочитано 06.12.2013, 22:05
#53
zamtmn

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


825 ревизия
+черчение выровненных и повернутых размеров
+комбобокс текущего размерного стиля
+черчение дуг
+опции для черчения окружностей (не связанные с выбором примитивов)

зы.
Приму помощь в виде написания окон редактирования стилей текста и стилей размеров, там ничего сложного - чистое формошлепство. Если кто хочет освоить Lazarus - самое то
zamtmn вне форума  
 
Автор темы   Непрочитано 14.12.2013, 11:24
#54
zamtmn

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


Добавил возможность "декорирования" параметров в инспекторе, Т.е. теперь при клике на строчке слоя открывается не вложенное поддерево с параметрами этого слоя, а комбобокс с определенными в чертеже слоями. Но это уже не автоматическая генерация содержимого инспектора и требует дополнительных усилий. Осталось решить вопрос по привязке к параметрам инспектора отдельных окон редактирования этих параметров и получится конфетка а не инспектор))
zamtmn вне форума  
 
Непрочитано 15.12.2013, 22:22
#55
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,999


Может попробовать какой-то аналог экселя присобачить....
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 15.12.2013, 23:16
#56
gomer

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


может еще кофеварку присобачить?
gomer вне форума  
 
Непрочитано 16.12.2013, 07:16
#57
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,999


Цитата:
Сообщение от gomer Посмотреть сообщение
может еще кофеварку присобачить?
Лучше принтер для купюр...
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Автор темы   Непрочитано 16.12.2013, 08:36
#58
zamtmn

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


Смех смехом, а инспектор штука нужная - благодаря ему можно забивать на бесконечное написание гуя. Собственно програмистов делфи\лазаря и не любят за это - обычно у них программы начинаются с формошлепства и весь код размазан по куче обработчиков onЧетоТам.
В краце как работает: при старте зкада парсится файл rtl\system.pas - там лежат все описания типов которые в дальнейшем доступны в инспекторе объектов. Описания на паскале и просто выдраны из исходников. Сначала я делал это руками, но потом написал небольшую утилитку - utils\typeexporter.exe, она проверяет все файлы исходников зкада отмеченные в utils\filelist.txt и экспортирует помеченные описания типов в rtl\system.pas.
т.е. я например определяю какуюто структуру данных в программе:
Код:
[Выделить все]
...
type
  TMyData=record
    data1,data2:integer;
  end;
...
И в дальнейшем хочу видеть ее в инспекторе. добавляю ссылку на файл с описанием TMyData в utils\filelist.txt если его там еще нет, помечаю TMyData для экспорта и по возможности даю параметрам "человеческие" имена. Получается чтото вроде
Код:
[Выделить все]
...
type
{EXPORT+}
  TMyData=record
    data1:GDBInteger;(*Поле данных 1*)
    data2:GDBInteger;(*Поле данных 2*)
  end;
{EXPORT-}
...
После запуска typeexporter.exe можно будет соответствующими процедурами "засовывать" данные типа TMyData в инспектор.
в описании доступны некоторые модификаторы для инспектора, они оформляются в виде коментариев в коде:
(*'какоето имя'*) - более понятное пользователю имя параметра, без него параметр называется также как в программе
(*oi_readonly*) - запрет редактирования параметра пользователем в инспекторе
(*hidden_in_objinsp*) - не отображать параметр в инспекторе

Кто считает что в зкадном инспекторе отображается много лишнего - это я просто забыл/лень поставить (*hidden_in_objinsp*) в соответствующем месте

Offtop: Товарищи офтоперы, отныне флуд и офтопик в теме разрешается только в обмен на чтото полезное, т.е. хочешь пофлудить - сначала (ну или потом) ченить закомить или подкинь идейку)). По курсу один офтопик пост на одно чтото полезное

Последний раз редактировалось zamtmn, 16.12.2013 в 09:38.
zamtmn вне форума  
 
Автор темы   Непрочитано 03.01.2014, 22:58
#59
zamtmn

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


>>Осталось решить вопрос по привязке к параметрам инспектора отдельных окон редактирования этих параметров и получится конфетка а не инспектор))
Выхожу из запоя)) - завершил "причесывание" инспектора. Теперь к любым типам данных в инспекторе можно привязать "быстый редактор" в виде кнопочки рядом со значением - он будет вызван при нажатии этой кнопочки (наподобии как до этого было сделано с boolean), и внешнюю процедуру отображения этого значения - т.е. теперь в инспекторе могут быть картинки толщин или типов линий и т.п., а не только сухие цифры/тексты.
В предидущей теме было замечание про "неинтуитивность" настройки привязок - стало всё интуитивно, осталось нарисовать форму этого редактора))
zamtmn вне форума  
 
Автор темы   Непрочитано 20.01.2014, 11:14
#60
zamtmn

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


Добавилась возможность указывать значения для инспектора в чертеже. Полная мелочь, а кровушки попила))
Миниатюры
Нажмите на изображение для увеличения
Название: dwg2objinsp.gif
Просмотров: 190
Размер:	262.8 Кб
ID:	120707  
zamtmn вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Создание CAD программы с нуля

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

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