OberonCore https://forum.oberoncore.ru/ |
|
DiaPlot - Построитель 2d графиков https://forum.oberoncore.ru/viewtopic.php?f=90&t=3009 |
Страница 1 из 2 |
Автор: | Иван Денисов [ Воскресенье, 21 Ноябрь, 2010 15:13 ] |
Заголовок сообщения: | DiaPlot - Построитель 2d графиков |
Открыт для совместного редактирования и обсуждения модуль для построения простых 2d графиков. https://svn.oberoncore.ru/community/bbcc/Dia/ (ред-р коллекции) 06.06.2013: совместная разработка перемещена из хранилища bbcc в другой репозиторий --- уточняйте у автора Модуль тестируется под BlackBox 1.6 (модератор) 13.12.2010: размещено в коллекции http://oberoncore.ru/bbcc/subs/dia/plot Вложение: (ред-р коллекции) 06.06.2013: устаревший архив компонента удалён |
Автор: | Роман М. [ Понедельник, 22 Ноябрь, 2010 14:04 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Неплохо для нулевой версии. Вообще, для построения графиков и всяких моделей использую Octave (пытающийся быть аналогом Matlab). Платформо-зависимые части нужно выность за пределы реализации интерфейса: Код: MODULE DiaHost; IMPORT WinApi, HostFonts, HostPorts, Ports, Fonts, Views; PROCEDURE DrawStringA* (f: Views.Frame; x, y, angle: INTEGER; col: Ports.Color; s: ARRAY OF CHAR; font: Fonts.Font); VAR n, a, res: INTEGER; df: HostFonts.DevFont; pt: HostPorts.Port; dc: WinApi.HANDLE; ind: WinApi.BOOL; NewFont: WinApi.HFONT; fsize: WinApi.SIZE; BEGIN pt := f.rider(HostPorts.Rider).port; dc := pt.dc; res := WinApi.SaveDC(dc); res := WinApi.SetBkMode(dc, WinApi.TRANSPARENT); res := WinApi.SetTextColor(dc, col); (* Вычисляем длину строки *) a := LEN(s) - 1; n := 0; WHILE (n < a) & (s[n] # 0X) DO INC(n) END; IF angle MOD 360 = 0 THEN (* Если угол поворота кратен 360, то использовать обычный шрифт *) df := font(HostFonts.Font).dev; res := WinApi.SelectObject(dc, df.id); res := WinApi.TextOutW(dc, x, y, s, n); res := WinApi.RestoreDC(dc, - 1) ELSE (* Иначе, создать новый шрифт *) NewFont := WinApi.CreateFontW( - ((font.size + pt.unit DIV 2) DIV pt.unit), 0, angle * 10, angle * 10, Fonts.normal, 0, 0, 0, 0, 7, 2, 1, 38, font.typeface); (* Вычислить ширину строки ind := WinApi.GetTextExtentPoint32W(dc, s, n, fsize); *) (* Выбрать шрифт *) res := WinApi.SelectObject(dc, NewFont); (* Вывести текст *) res := WinApi.TextOutW(dc, x, y, s, n); res := WinApi.RestoreDC(dc, - 1); (* Удалить шрифт *) ind := WinApi.DeleteObject(NewFont); END END DrawStringA; END DiaHost. В последствие такие модули будет легче заменять платформо-независимыми компонентами. |
Автор: | Евгений Темиргалеев [ Понедельник, 22 Ноябрь, 2010 23:10 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
divan писал(а): Предлагаю его в svn поместить. Разместил. Разработка открытая, желающие могут приступать Роман М. писал(а): Вообще, для построения графиков и всяких моделей использую Octave (пытающийся быть аналогом Matlab). а я вообще стараюсь использовать ББ везде, где возможно. Иногда простого компонента для графиков не хватало 24.11.2010: Последующее обсуждение 'Octave для графиков' отделено: viewtopic.php?p=54261#p54261 |
Автор: | Иван Денисов [ Четверг, 25 Ноябрь, 2010 02:01 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Цитата: В последствие такие модули будет легче заменять платформо-независимыми компонентами. Разумное предложение, спасибо! Сделаю так в какой-нибудь из версий, сейчас пока, чтобы не усложнять, все пока одном файле все же оставлю, но буду держать в голове. |
Автор: | Сергей Губанов [ Четверг, 25 Ноябрь, 2010 14:28 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Роман М. писал(а): Код: (* Вычисляем длину строки *) a := LEN(s) - 1; n := 0; WHILE (n < a) & (s[n] # 0X) DO INC(n) END; Чтобы сказать компилятору, что нужна длина строки, а не размер массива нужно написать знак доллара после имени массива: n := LEN(s$); s - массив букв, s$ - строка содержащаяся в этом массиве (цепочка литер до первого 0X). |
Автор: | Info21 [ Четверг, 25 Ноябрь, 2010 15:14 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Сергей Губанов писал(а): s - массив букв, Точнее, s$ -- имя значения, хранящегося в переменной s
s$ - строка содержащаяся в этом массиве (цепочка литер до первого 0X). |
Автор: | Иван Денисов [ Четверг, 25 Ноябрь, 2010 15:47 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Код: Вычисление длины строки в Компонентном Паскале - встроенная операция. Спасибо, переделаю. Вообще, я такое уже использовал, но иногда замыкает
|
Автор: | Axcel [ Пятница, 26 Ноябрь, 2010 01:08 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Цитата: PROCEDURE (axes: Rendaxes) HandlePropMsg (VAR msg: Properties.Message); CONST w = 160 * Ports.mm; h = 90 * Ports.mm; BEGIN WITH msg: Properties.SizePref DO IF (msg.w = Views.undefined)OR (msg.w = Views.undefined) THEN ---- а что здесь имелось ввиду? msg.w := w; msg.h := h END | msg: Properties.ResizePref DO msg.horFitToWin := TRUE; msg.verFitToWin := TRUE ELSE END END HandlePropMsg; а вообще по моему очень симпатично |
Автор: | Илья Ермаков [ Пятница, 26 Ноябрь, 2010 02:03 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Контейнер (в частности, корневой документ) шлёт вашей вьюхе SizePref в двух случаях: 1) когда размер ещё неизвестен - и спрашивается у вас; 2) когда назначается новый размер (например, пользователь перетаскивает рамочку) - и у вас спрашивается подтверждение. Сответственно, этот IF - фильтр на первый случай. Если его не поставить, то изменить размер не удастся - ваша вьюха будет перебивать предлагаемый ей новый размер своим старым по-умолчанию. Впрочем, достаточно одного undefined, т.к. в описании сообщения гарантируется, что w и h могут быть undefined только одновременно. |
Автор: | Geniepro [ Пятница, 26 Ноябрь, 2010 07:29 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Axcel писал(а): OR (msg.w = Views.undefined) По-видимому, здесь должно было бытьOR (msg.h = Views.undefined) |
Автор: | Axcel [ Пятница, 26 Ноябрь, 2010 14:43 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Спасибо, понятно. Но вот еще вопрос: PROCEDURE Create* (): Rendaxes, но тип Rendaxes не экспортируется. Если рассматривать в рабочем порядке, то так даже удобнее, сразу видно, что подключено, но с точки зрения "чистоты идеи" немного режет глаз. Может лучше что-то вроде PROCEDURE Create* (OUT a: Axes), а Create (): Rendaxes оставить внутри? |
Автор: | Иван Денисов [ Пятница, 26 Ноябрь, 2010 20:13 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Axcel писал(а): Спасибо, понятно. Спасибо за идею, не знал как поправить эту путаницу.Но вот еще вопрос: PROCEDURE Create* (): Rendaxes, но тип Rendaxes не экспортируется. Если рассматривать в рабочем порядке, то так даже удобнее, сразу видно, что подключено, но с точки зрения "чистоты идеи" немного режет глаз. Может лучше что-то вроде PROCEDURE Create* (OUT a: Axes), а Create (): Rendaxes оставить внутри? В итоге сделал так, сейчас. Код: PROCEDURE Create* (): Axes; VAR ar: Rendaxes; a: Axes; BEGIN NEW(ar); ar.curveCounter := 0; a := ar; RETURN a END Create; Илья Ермаков писал(а): Впрочем, достаточно одного undefined, т.к. в описании сообщения гарантируется, что w и h могут быть undefined только одновременно. Исправил
|
Автор: | Иван Денисов [ Вторник, 30 Ноябрь, 2010 10:59 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Залил новую версию 0.04 на форум. В ней, правда, остался мусор от разработки экспорта в SVG. Нужно сделать, чтобы график экспортировать можно было в формат SVG, разобрался пока только как в UTF-8 писать, выдернул пару функций из подсистемы Cpc. |
Автор: | Евгений Темиргалеев [ Воскресенье, 12 Декабрь, 2010 20:18 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Ссылки на примеры в контексте F1, Part III 6 View Construction Код: PROCEDURE Create* (): Axes; Такая штука обычно называется New. И к ней в пару обычно идёт Deposit. См. ObxViews0, ObxCubes.VAR ar: Rendaxes; a: Axes; BEGIN NEW(ar); ar.curveCounter := 0; a := ar; RETURN a END Create; Если вести речь о более сложном случае "отделения интерфейса и реализации", когда имеется абстрактная вьюшка и её скрытая стандартная реализация, то делают обычно делают фабрику (directory). См. ObxViews14 И типовые "создавалки" PROCEDURE QPlot* (x, y: ARRAY OF REAL; name, xtitle, ytitle: ARRAY OF CHAR); будут методами фабрики PROCEDURE (d: Directory) New* (x, y: ARRAY OF REAL; name, xtitle, ytitle: ARRAY OF CHAR): View, NEW, ABSTRACT; |
Автор: | Евгений Темиргалеев [ Воскресенье, 12 Декабрь, 2010 20:22 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Код: PROCEDURE Create* (): Axes; Rendaxes --- расширение Axes, поэтому допустимо (автоматическое) преобразование Rendaxes->Axes. Достаточно VAR ar: Rendaxes; a: Axes; BEGIN NEW(ar); ar.curveCounter := 0; a := ar; RETURN a END Create; Код: PROCEDURE Create* (): Axes;
VAR ar: Rendaxes; BEGIN NEW(ar); ar.curveCounter := 0; RETURN ar END Create; |
Автор: | Евгений Темиргалеев [ Воскресенье, 12 Декабрь, 2010 20:35 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
Не нужно делать каждую процедуру, которая работает с записью, её методом. Код: PROCEDURE (a: Axes) Show*, NEW; Вполне могут бытьPROCEDURE (a: Axes) Update*, NEW; PROCEDURE (a: Axes) SetStyle* (ident: INTEGER; mode: CHAR; size, color: INTEGER), NEW; Код: PROCEDURE Show* (a: Axes); Сравните: Views.Open, Views.Register, ... --- не являются методами.PROCEDURE Update* (a: Axes); PROCEDURE SetStyle* (a: Axes; ident: INTEGER; mode: CHAR; size, color: INTEGER); Код: PROCEDURE (a: Axes) Update*, NEW; Такая процедура, кажется, вообще не нужна. По идеологии каркаса (как я понимаю) подразумевается применение Views.Update(anyview,...) напрямую --- там где нужно.
BEGIN Views.Update(a, TRUE) END Update; |
Автор: | Евгений Темиргалеев [ Воскресенье, 12 Декабрь, 2010 20:56 ] |
Заголовок сообщения: | Re: Построитель 2d графиков |
divan писал(а): Нужно сделать, чтобы график экспортировать можно было в формат SVG, разобрался пока только как в UTF-8 писать, выдернул пару функций из подсистемы Cpc. Выгрузку во внешний формат правильнее реализовывать как процедуру-конвертер. См. Converters.Exporter. При её наличии достаточно зарегистрировать выгружающий конвертер и всю остальную работу (Save,...) обеспечат команды каркаса.Так, например, сделана выгрузка ББ-документа в html. Регистрация конвертера в Config: Код: Converters.Register("", "XhtmlExporter.ExportText", "TextViews.View", "html", {}); Сам конвертер в XhtmlExporter
|
Автор: | Иван Денисов [ Вторник, 18 Январь, 2011 08:46 ] |
Заголовок сообщения: | Re: DiaPlot - Построитель 2d графиков |
Хочу добавить функцию сохранения графика в BMP для начала хотя бы, но столкнулся со странной проблемой Сохраняется пустая (белая) вьюшка и все. Пробовал разные варианты, вот код одной из последних проверок. Код: Axes* = POINTER TO ABSTRACT RECORD (Views.View) title*: Views.Title; curve*: ARRAY 99 OF Curve; curveCounter: INTEGER; xtitle*, ytitle*: ARRAY 256 OF CHAR; grid*, legend*, auto*, isReady*: BOOLEAN; xmin*, xmax*, ymin*, ymax*: REAL; leg: Legend; END; Rendaxes = POINTER TO RECORD (Axes) END; ... PROCEDURE SaveRastr(a: Rendaxes; name1: ARRAY OF CHAR); VAR res: INTEGER; bmp: Converters.Converter; path: Files.Locator; name: Files.Name; BEGIN bmp := Converters.list; path := Files.dir.This(""); name := name1$; WHILE (bmp # NIL) & (bmp.fileType # "bmp") DO bmp := bmp.next END; Views.Register(HostBitmaps.ViewToBitmap(a, 24), Views.dontAsk, path, name, bmp, res) END SaveRastr; PROCEDURE (axes: Rendaxes) Restore (f: Views.Frame; fl, ft, fr, fb: INTEGER); ... SaveRastr(axes, "test.bmp"); END Restore; Подскажите, в чем может быть проблема, пожалуйста! |
Автор: | Info21 [ Вторник, 18 Январь, 2011 12:20 ] |
Заголовок сообщения: | Re: DiaPlot - Построитель 2d графиков |
divan писал(а): Хочу добавить функцию сохранения графика в BMP для начала хотя бы, но столкнулся со странной проблемой Это опять 1.6?Сохраняется пустая (белая) вьюшка и все. В сборках от И-21 всё работает. Вроде. Там, правда, какая-то примочка была вставлена от Оминк. Посмотрите сами (File, Save As Bitmap). |
Автор: | Иван Денисов [ Вторник, 18 Январь, 2011 15:46 ] |
Заголовок сообщения: | Re: DiaPlot - Построитель 2d графиков |
Info21 писал(а): divan писал(а): В сборках от И-21 всё работает. Вроде. Там, правда, какая-то примочка была вставлена от Оминк. Посмотрите сами (File, Save As Bitmap). А что работает? Для обычных вьюшек такой способ (см.выше) работает, я же делал реализацию записи видео с вьюшек еще давно. Там все сохраняется таким методом. А тут видимо из-за сложного наследования возникает косяк, точнее недопонимание с моей стороны, как в таком случае сохранять надо |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |