САПР на Lazarus

Планы, идеология, архитектура и т.п.

Модератор: Модераторы

Re: САПР на Lazarus

Сообщение sts » 01.08.2015 15:11:13

sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: САПР на Lazarus

Сообщение zub » 01.08.2015 19:59:35

sts
Спасибо, поучительно. но это только когданибудь потом, пока нужен простой вариант без nv_, т.е. работающий на всем
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение zub » 08.08.2015 02:14:40

Понадобился еще один тестик. Исходник+бинарник win32 тут http://sourceforge.net/projects/zcad/fi ... p/download

Давным давно я отказался от какихлибо расчетов во время рендера, всё зарание просчитано и хранится. Сейчас подумываю поэкономить память и для некоторых вещей вернуть расчеты налету. Если для опенгл умножение на матрицу бесплатная процедура - один фиг все вершины множатся на MODELVIEW, то для гди это нужно ручками помножить. На моем i7 всеравно получается почти бесплатно, на какомнибудь целероне наверно будет падение производительности.

Снова нужны счастливые обладатели слабых cpu)) Порядок теста: запустить, нажать "Run test", скопипастить результаты. Поставить галку "transform" и опять нажать "Run test" и скопипастить.
тест рисует 1000000 случайных линий, домножая или недомножая их координаты на матрицу 4х4, в зависимости от галки "transform"
мои результаты:
без умножения
OpenGL driver info: NVIDIA Corporation GeForce GTX 970/PCIe/SSE2 4.5.0 NVIDIA 347.52
Draw 1000000 random lines
Canvas: 1133msec
OpenGL: 98msec

с умножением
OpenGL driver info: NVIDIA Corporation GeForce GTX 970/PCIe/SSE2 4.5.0 NVIDIA 347.52
Draw 1000000 random lines
Canvas: 1183msec
OpenGL: 95msec
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение kazalex » 08.08.2015 12:18:21

zub писал(а):запустить, нажать "Run test", скопипастить результаты. Поставить галку "transform" и опять нажать "Run test" и скопипастить


Код: Выделить всё
[ ] transform
OpenGL driver info: NVIDIA Corporation GeForce FX Go5200/AGP/SSE2 1.4.0
Draw 1000000 random lines
Canvas: 2631msec
OpenGL: 1229msec

[v] transform
OpenGL driver info: NVIDIA Corporation GeForce FX Go5200/AGP/SSE2 1.4.0
Draw 1000000 random lines
Canvas: 2446msec
OpenGL: 973msec
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: САПР на Lazarus

Сообщение zub » 09.08.2015 11:23:54

kazalex спасибо!
Странно что "домноженное" время меньше. Видимо влияет что во втором случае "зарисовывается" не вся область отображения
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение zub » 13.08.2015 14:29:18

Добавил возможность использовать при GDI рендере стандартный системный механизм рисования текста. Пока в виде:
Код: Выделить всё
procedure TLLGDISymbol.drawSymbol(drawer:TZGLAbstractDrawer;var rc:TDrawContext;var GeomData:ZGLGeomData;var LLPArray:GDBOpenArrayOfData;var OptData:ZGLOptimizerData);
begin
  //inherited;//там вывод букв треугольниками
  TextOut(TZGLGDIDrawer(drawer).OffScreedDC, 100, 100, 'h', 1);//Тут будет вывод букв системными средствами
end;

т.е. пока по количеству букв в чертеже рисуется буква 'h' в фиксированных координатах, а не соответствующие символы в соотвктствующих позициях. Переключений шрифтов и размеров символов еще нет, надеюсь их добавление не съест выигрыш производительности. Планирую заюзать системную рисовалку для отображения текста "перпендикулярного" камере, в остальных случаях использовать свою "треугольную"
Порылся в winapih.inc и касаемо рисования текста нашел только:
Код: Выделить всё
...
function DrawText(DC: HDC; Str: PChar; Count: Integer; var Rect: TRect; Flags: Cardinal): Integer;
...
function ExtTextOut(DC: HDC; X, Y: Integer; Options: Longint; Rect: PRect; Str: PChar; Count: Longint; Dx: PInteger): Boolean;
...
function TextOut(DC: HDC; X,Y : Integer; Str : Pchar; Count: Integer) : Boolean;
...

Чето както маловато... как управлять углом поворота текста? сжатием символов? наклоном(скосом)?
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение Sharfik » 13.08.2015 18:18:45

zub писал(а):Чето както маловато... как управлять углом поворота текста? сжатием символов? наклоном(скосом)?

Скорее всего не стали так заморачиваться, потому что можно сначала ровно нарисовать текст, а потом функциями преобразования полученную картинку крутить, сжимать и т.п.
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: САПР на Lazarus

Сообщение sts » 13.08.2015 18:58:16

хехе, это вы смотрите API 91 года выпуска, я им рисовал наклонный текст - без сглаживания (нету его изначально) выглядит не очень,
потом доработали и назвали GDI+, вот его и смотрите, както качал с примерами под паскаль под винду.

Добавлено спустя 8 минут 31 секунду:
да, GDI+ с XP появился, как раз для его красивостей, раньше это была реальная проблема, 2000я в ходу была
sts
постоялец
 
Сообщения: 431
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Re: САПР на Lazarus

Сообщение zub » 13.08.2015 21:24:19

sts
Дело собственно не в годах и сглаживании - добавить гди+ или канвас рисовалки глядя на рабочий вариант с гди - будет не сложно.
Сейчас у меня идет выробатывание интерфейса между движком и рисовалкой, гди был выбран потому что кроссплатформенно (сам удивился что лазаревская обертка над гди работает и в гтк и в куте с минимальными доработками), в разы быстрее чем гди+, и реализует базовый функционал 2Д черчения.
Скрестить гди и опенгл довольно сложно, в тотже
Код: Выделить всё
procedure TLLGDISymbol.drawSymbol(drawer:TZGLAbstractDrawer;var rc:TDrawContext;var GeomData:ZGLGeomData;var LLPArray:GDBOpenArrayOfData;var OptData:ZGLOptimizerData);

пока приходит только векторное представление символа и матрица преобразования, а надо код символа,точку вставки, наклон, скос + еще чтонить. Хранить это в движке или налету выдирать из матрицы... - пока это эксперименты по вырабатыванию подходящих на все случаи жизни структур данных.

Sharfik
>>Скорее всего не стали так заморачиваться, потому что можно сначала ровно нарисовать текст, а потом функциями преобразования полученную картинку крутить, сжимать и т.п.
Поподробнее можно? Насколько я понимаю гди умеет только худо-бедно масштабировать. крутить и косить вроде неумеет. Если имеется в виду рисование в LCLный битмап, а потом вывод на экран с преобразованием - непойдет, медленно
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение Sharfik » 13.08.2015 22:31:37

zub писал(а):Sharfik
>>Скорее всего не стали так заморачиваться, потому что можно сначала ровно нарисовать текст, а потом функциями преобразования полученную картинку крутить, сжимать и т.п.
Поподробнее можно? Насколько я понимаю гди умеет только худо-бедно масштабировать. крутить и косить вроде неумеет. Если имеется в виду рисование в LCLный битмап, а потом вывод на экран с преобразованием - непойдет, медленно

Я в общих чертах обрисовал идею, как сделать. С GDI не работал. Доступ к картинке с нарисованным текстом по пикселям есть? Функция поворота не так сложна. Масштабировать он может сразу по всем направлениям или можно как то задать куда надо вписать?
Аватара пользователя
Sharfik
энтузиаст
 
Сообщения: 791
Зарегистрирован: 20.07.2013 01:04:30

Re: САПР на Lazarus

Сообщение zub » 13.08.2015 22:47:52

Доступа нет, а если и есть то медленный и им пользоваться нестоит=нельзя. В гди есть контекст устроства, к этому контексту сопоставлен битмап. При хорошем раскладе битмап лежит в видеопамяти, при плохом гденить в закрамах gdi.dll или как ее там. Пару страниц назад я постил результат гдишного масштабирования.
Если средствами лазаревой гди обертки можно отобразить только текст со сжатием=1 поворотом=0 и наклоном=0 то овчинка явно не стоит выделки... такие тексты в чертежах почти не встречаются((
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение kazalex » 13.08.2015 23:40:21

zub писал(а):Чето както маловато... как управлять углом поворота текста? сжатием символов? наклоном(скосом)?

Угол поворота определяется свойством шрифта - Orientation, наклон стилем - Style.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: САПР на Lazarus

Сообщение zub » 14.08.2015 15:08:06

т.е. всё это можно указать только при создании шрифта, вобщем то логично, но усложняет процесс(( придется кешировать созданные шрифты и при всех изменениях масштаба пересоздавать
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Re: САПР на Lazarus

Сообщение kazalex » 14.08.2015 20:50:44

Ещё прикол в том, что если будешь использовать ExTextOut/ExtUTF8Out для управления межсимвольными интервалами, то случится облом с поворотом т.к. эти функции его не учитывают. Для этих целей можно использовать ещё и SetTextCharacterExtra, на она реализована только для винды.
kazalex
постоялец
 
Сообщения: 296
Зарегистрирован: 01.06.2012 14:54:10

Re: САПР на Lazarus

Сообщение Pavia » 14.08.2015 21:38:07

Вообще делается так. При помощи GDI рисуется текст. Только рисуется он в Path, а не в Bitmap. Далее крутиться и растягиваете как хотите, хоть в узел вежи. Всё делаете головой при помощи математики и геометрии. При помощи сплайнов можно везать в узел. А затем новый Path растеризуется в Bitmap. Который собственно и кэшируется. И лучше кэшировать не по одной букве, а словами.


Вместо GDI можно использовать кросплатформенную библиотеку font_freetype

Примеры можно посмотреть в Agg и AggPas
http://www.antigrain.com/demo/index.html

Добавлено спустя 9 минут 21 секунду:
zub писал(а):тест рисует 1000000 случайных линий, домножая или недомножая их координаты на матрицу 4х4,

Интел в своё время выкладывала алгоритмы умножения матриц. 30 тактов было на PIII, так что у вас не очень оптимально. Плюс к тому же для поворота и масштабирование не требуется всех умножение. Поэтому кватерионы в графики и любят, что для ряда задач с ними можно снизить число операций умножений. Вернее можно и без них просто с ними проще объяснить как упростить.
Аватара пользователя
Pavia
постоялец
 
Сообщения: 290
Зарегистрирован: 07.01.2011 12:46:51

Пред.След.

Вернуться в Разработки на нашем сайте

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 4

Рейтинг@Mail.ru