OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 28 Март, 2024 13:57

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: DiaPlot - Построитель 2d графиков
СообщениеДобавлено: Воскресенье, 21 Ноябрь, 2010 15:13 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Открыт для совместного редактирования и обсуждения модуль для построения простых 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

Вложение:
Комментарий к файлу: Примеры графиков
Снимок.png
Снимок.png [ 58.23 КБ | Просмотров: 14204 ]

(ред-р коллекции) 06.06.2013: устаревший архив компонента удалён


Последний раз редактировалось Иван Денисов Суббота, 05 Февраль, 2011 11:05, всего редактировалось 11 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 14:04 

Зарегистрирован: Пятница, 25 Сентябрь, 2009 13:10
Сообщения: 1177
Откуда: Мариуполь
Неплохо для нулевой версии. Вообще, для построения графиков и всяких моделей использую 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.


В последствие такие модули будет легче заменять платформо-независимыми компонентами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Понедельник, 22 Ноябрь, 2010 23:10 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
divan писал(а):
Предлагаю его в svn поместить.
Разместил. Разработка открытая, желающие могут приступать :)
Роман М. писал(а):
Вообще, для построения графиков и всяких моделей использую Octave (пытающийся быть аналогом Matlab).
а я вообще стараюсь использовать ББ везде, где возможно. Иногда простого компонента для графиков не хватало :)

24.11.2010: Последующее обсуждение 'Octave для графиков' отделено: viewtopic.php?p=54261#p54261


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Четверг, 25 Ноябрь, 2010 02:01 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Цитата:
В последствие такие модули будет легче заменять платформо-независимыми компонентами.

Разумное предложение, спасибо! Сделаю так в какой-нибудь из версий, сейчас пока, чтобы не усложнять, все пока одном файле все же оставлю, но буду держать в голове.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Четверг, 25 Ноябрь, 2010 14:28 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Роман М. писал(а):
Код:
      (* Вычисляем длину строки *)
      a := LEN(s) - 1; n := 0;
      WHILE (n < a) & (s[n] # 0X) DO
         INC(n)
      END;
Вычисление длины строки в Компонентном Паскале - встроенная операция.

Чтобы сказать компилятору, что нужна длина строки, а не размер массива нужно написать знак доллара после имени массива:

n := LEN(s$);

s - массив букв,
s$ - строка содержащаяся в этом массиве (цепочка литер до первого 0X).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Четверг, 25 Ноябрь, 2010 15:14 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Сергей Губанов писал(а):
s - массив букв,
s$ - строка содержащаяся в этом массиве (цепочка литер до первого 0X).
Точнее, s$ -- имя значения, хранящегося в переменной s :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Четверг, 25 Ноябрь, 2010 15:47 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Код:
Вычисление длины строки в Компонентном Паскале - встроенная операция.
Спасибо, переделаю. Вообще, я такое уже использовал, но иногда замыкает :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Пятница, 26 Ноябрь, 2010 01:08 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Цитата:
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;

а вообще по моему очень симпатично


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Пятница, 26 Ноябрь, 2010 02:03 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Контейнер (в частности, корневой документ) шлёт вашей вьюхе SizePref в двух случаях:
1) когда размер ещё неизвестен - и спрашивается у вас;
2) когда назначается новый размер (например, пользователь перетаскивает рамочку) - и у вас спрашивается подтверждение.

Сответственно, этот IF - фильтр на первый случай.
Если его не поставить, то изменить размер не удастся - ваша вьюха будет перебивать предлагаемый ей новый размер своим старым по-умолчанию.

Впрочем, достаточно одного undefined, т.к. в описании сообщения гарантируется, что w и h могут быть undefined только одновременно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Пятница, 26 Ноябрь, 2010 07:29 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Axcel писал(а):
OR (msg.w = Views.undefined)
По-видимому, здесь должно было быть

OR (msg.h = Views.undefined)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Пятница, 26 Ноябрь, 2010 14:43 

Зарегистрирован: Понедельник, 05 Июнь, 2006 09:49
Сообщения: 327
Откуда: Ленинград, Емельянов Алексей Николаевич
Спасибо, понятно.
Но вот еще вопрос: PROCEDURE Create* (): Rendaxes, но тип Rendaxes не экспортируется. Если рассматривать в рабочем порядке, то так даже удобнее, сразу видно, что подключено, но с точки зрения "чистоты идеи" немного режет глаз. Может лучше что-то вроде PROCEDURE Create* (OUT a: Axes), а Create (): Rendaxes оставить внутри?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Пятница, 26 Ноябрь, 2010 20:13 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
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 только одновременно.
Исправил :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Вторник, 30 Ноябрь, 2010 10:59 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Залил новую версию 0.04 на форум.
В ней, правда, остался мусор от разработки экспорта в SVG.
Нужно сделать, чтобы график экспортировать можно было в формат SVG, разобрался пока только как в UTF-8 писать, выдернул пару функций из подсистемы Cpc.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Воскресенье, 12 Декабрь, 2010 20:18 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Ссылки на примеры в контексте F1, Part III 6 View Construction
Код:
   PROCEDURE Create* (): Axes;
      VAR ar: Rendaxes; a: Axes;
   BEGIN
      NEW(ar);
      ar.curveCounter := 0;
      a := ar;
      RETURN a
   END Create;
Такая штука обычно называется New. И к ней в пару обычно идёт Deposit. См. ObxViews0, ObxCubes.

Если вести речь о более сложном случае "отделения интерфейса и реализации", когда имеется абстрактная вьюшка и её скрытая стандартная реализация, то делают обычно делают фабрику (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;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Воскресенье, 12 Декабрь, 2010 20:22 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Код:
   PROCEDURE Create* (): Axes;
      VAR ar: Rendaxes; a: Axes;
   BEGIN
      NEW(ar);
      ar.curveCounter := 0;
      a := ar;
      RETURN a
   END Create;
Rendaxes --- расширение Axes, поэтому допустимо (автоматическое) преобразование Rendaxes->Axes. Достаточно
Код:
   PROCEDURE Create* (): Axes;
      VAR ar: Rendaxes;
   BEGIN
      NEW(ar);
      ar.curveCounter := 0;
      RETURN ar
   END Create;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Воскресенье, 12 Декабрь, 2010 20:35 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
Не нужно делать каждую процедуру, которая работает с записью, её методом.
Код:
   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);
   PROCEDURE Update* (a: Axes);
   PROCEDURE SetStyle* (a: Axes; ident: INTEGER; mode: CHAR; size, color: INTEGER);
Сравните: Views.Open, Views.Register, ... --- не являются методами.
Код:
   PROCEDURE (a: Axes) Update*, NEW;
   BEGIN
      Views.Update(a, TRUE)
   END Update;
Такая процедура, кажется, вообще не нужна. По идеологии каркаса (как я понимаю) подразумевается применение Views.Update(anyview,...) напрямую --- там где нужно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Построитель 2d графиков
СообщениеДобавлено: Воскресенье, 12 Декабрь, 2010 20:56 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4625
Откуда: Россия, Орёл
divan писал(а):
Нужно сделать, чтобы график экспортировать можно было в формат SVG, разобрался пока только как в UTF-8 писать, выдернул пару функций из подсистемы Cpc.
Выгрузку во внешний формат правильнее реализовывать как процедуру-конвертер. См. Converters.Exporter. При её наличии достаточно зарегистрировать выгружающий конвертер и всю остальную работу (Save,...) обеспечат команды каркаса.

Так, например, сделана выгрузка ББ-документа в html. Регистрация конвертера в Config:
Код:
Converters.Register("", "XhtmlExporter.ExportText", "TextViews.View", "html", {});
Сам конвертер в XhtmlExporter :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DiaPlot - Построитель 2d графиков
СообщениеДобавлено: Вторник, 18 Январь, 2011 08:46 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Хочу добавить функцию сохранения графика в 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;

Подскажите, в чем может быть проблема, пожалуйста!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DiaPlot - Построитель 2d графиков
СообщениеДобавлено: Вторник, 18 Январь, 2011 12:20 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
divan писал(а):
Хочу добавить функцию сохранения графика в BMP для начала хотя бы, но столкнулся со странной проблемой :(
Сохраняется пустая (белая) вьюшка и все.
Это опять 1.6?

В сборках от И-21 всё работает. Вроде.
Там, правда, какая-то примочка была вставлена от Оминк. Посмотрите сами (File, Save As Bitmap).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DiaPlot - Построитель 2d графиков
СообщениеДобавлено: Вторник, 18 Январь, 2011 15:46 
Аватара пользователя

Зарегистрирован: Четверг, 08 Октябрь, 2009 15:00
Сообщения: 3774
Info21 писал(а):
divan писал(а):
В сборках от И-21 всё работает. Вроде.
Там, правда, какая-то примочка была вставлена от Оминк. Посмотрите сами (File, Save As Bitmap).

А что работает? Для обычных вьюшек такой способ (см.выше) работает, я же делал реализацию записи видео с вьюшек еще давно. Там все сохраняется таким методом. А тут видимо из-за сложного наследования возникает косяк, точнее недопонимание с моей стороны, как в таком случае сохранять надо :(


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB