From: <jb...@us...> - 2008-08-08 00:20:01
|
Revision: 8615 http://plplot.svn.sourceforge.net/plplot/?rev=8615&view=rev Author: jbauck Date: 2008-08-08 00:20:10 +0000 (Fri, 08 Aug 2008) Log Message: ----------- Add interactive Ada examples x14a.adb, xthick14a.adb, x17a.adb, xthick17a.adb. These need further testing on other systems since I don't have Tcl/Tk installed on mine (for Example 14). Examples 17 contain a bug whereby all legend strings are identical and equal to the fourth string, but I'm committing it anyway in case there are other problems that I haven't found. Modified Paths: -------------- trunk/examples/ada/CMakeLists.txt trunk/examples/ada/Makefile.examples.in trunk/plplot_test/test_ada.sh.in Added Paths: ----------- trunk/examples/ada/x14a.adb.cmake trunk/examples/ada/x17a.adb.cmake trunk/examples/ada/xthick14a.adb.cmake trunk/examples/ada/xthick17a.adb.cmake Modified: trunk/examples/ada/CMakeLists.txt =================================================================== --- trunk/examples/ada/CMakeLists.txt 2008-08-07 22:04:50 UTC (rev 8614) +++ trunk/examples/ada/CMakeLists.txt 2008-08-08 00:20:10 UTC (rev 8615) @@ -32,8 +32,10 @@ "11" "12" "13" +"14" "15" "16" +"17" "18" "19" "21" @@ -59,8 +61,10 @@ "thick11" "thick12" "thick13" +"thick14" "thick15" "thick16" +"thick17" "thick18" "thick19" "thick21" Modified: trunk/examples/ada/Makefile.examples.in =================================================================== --- trunk/examples/ada/Makefile.examples.in 2008-08-07 22:04:50 UTC (rev 8614) +++ trunk/examples/ada/Makefile.examples.in 2008-08-08 00:20:10 UTC (rev 8615) @@ -43,8 +43,10 @@ x11a$(EXEEXT) \ x12a$(EXEEXT) \ x13a$(EXEEXT) \ + x14a$(EXEEXT) \ x15a$(EXEEXT) \ x16a$(EXEEXT) \ + x17a$(EXEEXT) \ x18a$(EXEEXT) \ x19a$(EXEEXT) \ x21a$(EXEEXT) \ @@ -70,8 +72,10 @@ xthick11a$(EXEEXT) \ xthick12a$(EXEEXT) \ xthick13a$(EXEEXT) \ + xthick14a$(EXEEXT) \ xthick15a$(EXEEXT) \ xthick16a$(EXEEXT) \ + xthick17a$(EXEEXT) \ xthick18a$(EXEEXT) \ xthick19a$(EXEEXT) \ xthick21a$(EXEEXT) \ Added: trunk/examples/ada/x14a.adb.cmake =================================================================== --- trunk/examples/ada/x14a.adb.cmake (rev 0) +++ trunk/examples/ada/x14a.adb.cmake 2008-08-08 00:20:10 UTC (rev 8615) @@ -0,0 +1,371 @@ +-- $Id$ + +-- Demo of multiple stream/window capability (requires Tk or Tcl-DP). + +-- Maurice LeBrun +-- IFS, University of Texas at Austin + +-- Copyright (C) 2008 Jerry Bauck + +-- This file is part of PLplot. + +-- PLplot is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Library Public License as published +-- by the Free Software Foundation; either version 2 of the License, or +-- (at your option) any later version. + +-- PLplot is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Library General Public License for more details. + +-- You should have received a copy of the GNU Library General Public License +-- along with PLplot; if not, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +with + System, + Ada.Text_IO, + Ada.Strings, + Ada.Strings.Fixed, + Ada.Strings.Unbounded, + Ada.Numerics, + Ada.Numerics.Long_Elementary_Functions, + PLplot_Traditional, + PLplot_Auxiliary; +use + Ada.Text_IO, + Ada.Numerics, + Ada.Strings, + Ada.Strings.Fixed, + Ada.Strings.Unbounded, + Ada.Numerics.Long_Elementary_Functions, + PLplot_Traditional, + PLplot_Auxiliary; + +-- COMMENT THIS LINE IF YOUR COMPILER DOES NOT INCLUDE THESE +-- DEFINITIONS, FOR EXAMPLE, IF IT IS NOT ADA 2005 WITH ANNEX G.3 COMPLIANCE. +--with Ada.Numerics.Long_Real_Arrays; use Ada.Numerics.Long_Real_Arrays; +@Ada_Is_2007_With_and_Use_Numerics@ + +------------------------------------------------------------------------------ +-- Plots several simple functions from other example programs. +-- +-- This version sends the output of the first 4 plots (one page) to two +-- independent streams. +------------------------------------------------------------------------------ + +procedure x14a is + -- Select either TK or DP driver and use a small window + -- Using DP results in a crash at the end due to some odd cleanup problems + -- The geometry strings MUST be in writable memory + geometry_master : String := "500x410+100+200"; + geometry_slave : String := "500x410+650+200"; + driver : Unbounded_String; + digmax : Integer; + xscale, yscale, xoff, yoff : Long_Float; + xs, ys : Real_Vector(0 .. 5); + space0 : Integer_Array_1D(1 .. 1) := (Others => 0); + mark0 : Integer_Array_1D(1 .. 1) := (Others => 0); + space1 : Integer_Array_1D(1 .. 1) := (Others => 1500); + mark1 : Integer_Array_1D(1 .. 1) := (Others => 1500); + + procedure plot1 is + xmin, xmax, ymin, ymax : Long_Float; + x, y : Real_Vector(0 .. 59); + begin + for i in x'range loop + x(i) := xoff + xscale * Long_Float(i + 1) / Long_Float(x'Length); + y(i) := yoff + yscale * x(i) * x(i); + end loop; + + xmin := x(x'First); + xmax := x(x'Last); + ymin := y(y'First); + ymax := y(y'Last); + + for i in xs'range loop + xs(i) := x(i * 10 + 3); + ys(i) := y(i * 10 + 3); + end loop; + + -- Set up the viewport and window using PLENV. The range in X is + -- 0.0 to 6.0, and the range in Y is 0.0 to 30.0. The axes are + -- scaled separately (just := 0), and we just draw a labelled + -- box (axis := 0). + plcol0(1); + plenv(xmin, xmax, ymin, ymax, 0, 0); + plcol0(6); + pllab("(x)", "(y)", "#frPLplot Example 1 - y=x#u2"); + + -- Plot the data points + plcol0(9); + plpoin(xs, ys, 9); + + -- Draw the line through the data + plcol0(4); + plline(x, y); + plflush; + end plot1; + + -- ================================================================ + + + procedure plot2 is + x, y : Real_Vector(0 .. 99); + begin + -- Set up the viewport and window using PLENV. The range in X is -2.0 to + -- 10.0, and the range in Y is -0.4 to 2.0. The axes are scaled separately + -- (just = 0), and we draw a box with axes (axis = 1). + plcol0(1); + plenv(-2.0, 10.0, -0.4, 1.2, 0, 1); + plcol0(2); + pllab("(x)", "sin(x)/x", "#frPLplot Example 1 - Sinc Function"); + + -- Fill up the arrays + for i in x'range loop + x(i) := (Long_Float(i) - 19.0) / 6.0; + y(i) := 1.0; + if x(i) /= 0.0 then + y(i) := sin(x(i)) / x(i); + end if; + end loop; + + -- Draw the line + plcol0(3); + plline(x, y); + plflush; + end plot2; + + -- ================================================================ + + + procedure plot3 is + x, y : Real_Vector(0 .. 100); + begin + -- For the final graph we wish to override the default tick intervals, and + -- so do not use PLENV + + pladv(0); + + -- Use standard viewport, and define X range from 0 to 360 degrees, Y range + -- from -1.2 to 1.2. + plvsta; + plwind(0.0, 360.0, -1.2, 1.2); + + -- Draw a box with ticks spaced 60 degrees apart in X, and 0.2 in Y. + plcol0(1); + plbox("bcnst", 60.0, 2, "bcnstv", 0.2, 2); + + -- Superimpose a dashed line grid, with 1.5 mm marks and spaces. + plstyl(mark1, space1); + plcol0(2); + plbox("g", 30.0, 0, "g", 0.2, 0); + plstyl(Default_Continuous_Line); + + plcol0(3); + pllab("Angle (degrees)", "sine", "#frPLplot Example 1 - Sine function"); + + for i in x'range loop + x(i) := 3.6 * Long_Float(i); + y(i) := sin(x(i) * pi / 180.0); + end loop; + + plcol0(4); + plline(x, y); + plflush; + end plot3; + + -- ================================================================ + + + procedure plot4 is + dtr, theta, dx, dy, r : Long_Float; + x, y, x0, y0 : Real_Vector(0 .. 360); + begin + dtr := pi / 180.0; + for i in x0'range loop + x0(i) := cos(dtr * Long_Float(i)); + y0(i) := sin(dtr * Long_Float(i)); + end loop; + + -- Set up viewport and window, but do not draw box + plenv(-1.3, 1.3, -1.3, 1.3, 1, -2); + for i in 1 .. 10 loop + for j in x'range loop + x(j) := 0.1 * Long_Float(i) * x0(j); + y(j) := 0.1 * Long_Float(i) * y0(j); + end loop; + + -- Draw circles for polar grid + plline(x, y); + end loop; + + plcol0(2); + for i in 0 .. 11 loop + theta := 30.0 * Long_Float(i); + dx := cos(dtr * theta); + dy := sin(dtr * theta); + + -- Draw radial spokes for polar grid + pljoin(0.0, 0.0, dx, dy); + + -- Write labels for angle + -- Slightly off zero to avoid floating point logic flips at 90 and 270 deg. + if dx >= -0.00001 then + plptex(dx, dy, dx, dy, -0.15, Trim(Integer'image(Integer(theta)), Left)); + else + plptex(dx, dy, -dx, -dy, 1.15, Trim(Integer'image(Integer(theta)), Left)); + end if; + end loop; + + -- Draw the graph + for i in x'range loop + r := sin(dtr * Long_Float(5 * i)); + x(i) := x0(i) * r; + y(i) := y0(i) * r; + end loop; + plcol0(3); + plline(x, y); + + plcol0(4); + plmtex("t", 2.0, 0.5, 0.5, "#frPLplot Example 3 - r(#gh)=sin 5#gh"); + plflush; + end plot4; + + -- ================================================================ + + + -- Demonstration of contour plotting + procedure plot5 is + XPTS : constant Integer := 35; + YPTS : constant Integer := 46; + -- Transformation function + XSPA : Long_Float := 2.0 / Long_Float(XPTS - 1); + YSPA : Long_Float := 2.0 / Long_Float(YPTS - 1); + tr : Real_Vector(0 .. 5) := (XSPA, 0.0, -1.0, 0.0, YSPA, -1.0); + xx, yy : Long_Float; + mark : Integer_Array_1D(1 .. 1) := (Others => 1500); + space : Integer_Array_1D(1 .. 1) := (Others => 1500); + z, w : Real_Matrix(0 .. XPTS -1, 0 .. YPTS - 1); + clevel : Real_Vector(0 .. 10) := + (-1.0, -0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0); + + procedure mypltr -- This spec is necessary to accommodate pragma Convention(C...). + (x, y : Long_Float; + tx, ty : out Long_Float; + pltr_data : PLpointer); + pragma Convention(Convention => C, Entity => mypltr); + + procedure mypltr + (x, y : Long_Float; + tx, ty : out Long_Float; + pltr_data : PLpointer) + is + begin + tx := tr(0) * x + tr(1) * y + tr(2); + ty := tr(3) * x + tr(4) * y + tr(5); + end mypltr; + + begin + for i in z'range(1) loop + xx := Long_Float(i - (XPTS / 2)) / Long_Float(XPTS / 2); + for j in z'range(2) loop + yy := Long_Float(j - (YPTS / 2)) / Long_Float(YPTS / 2) - 1.0; + z(i, j) := xx * xx - yy * yy; + w(i, j) := 2.0 * xx * yy; + end loop; + end loop; + + plenv(-1.0, 1.0, -1.0, 1.0, 0, 0); + plcol0(2); + plcont(z, 1, XPTS, 1, YPTS, clevel, mypltr'Unrestricted_Access, System.Null_Address); + plstyl(mark, space); + plcol0(3); + plcont(w, 1, XPTS, 1, YPTS, clevel, mypltr'Unrestricted_Access, System.Null_Address); + plcol0(1); + pllab("X Coordinate", "Y Coordinate", "Streamlines of flow"); + plflush; + end plot5; + + +begin + -- plplot initialization + -- Parse and process command line arguments + plparseopts(PL_PARSE_FULL); + + driver := To_Unbounded_String(plgdev); + + Put_Line("Demo of multiple output streams via the " & plgdev & "driver."); + Put_Line("Running with the second stream as slave to the first."); + New_Line; + + -- Set up first stream + plsetopt("geometry", geometry_master); + + plsdev(To_String(driver)); + plssub(2, 2); + plinit; + + -- Start next stream + plsstrm(1); + + -- Turn off pause to make this a slave (must follow master) + plsetopt("geometry", geometry_slave); + plspause(False); + plsdev(To_String(driver)); + plinit; + + -- Set up the data & plot + -- Original case + plsstrm(0); + + xscale := 6.0; + yscale := 1.0; + xoff := 0.0; + yoff := 0.0; + plot1; + + -- Set up the data & plot + xscale := 1.0; + yscale := 1.0e+6; + plot1; + + -- Set up the data & plot + xscale := 1.0; + yscale := 1.0e-6; + digmax := 2; + plsyax(digmax, 0); + plot1; + + -- Set up the data & plot + xscale := 1.0; + yscale := 0.0014; + yoff := 0.0185; + digmax := 5; + plsyax(digmax, 0); + plot1; + + -- To slave + -- The pleop ensures the eop indicator gets lit. + plsstrm(1); + plot4; + pleop; + + -- Back to master + plsstrm(0); + plot2; + plot3; + + -- To slave + plsstrm(1); + plot5; + pleop; + + -- Back to master to wait for user to advance + plsstrm(0); + pleop; + + -- Call plend to finish off. + plend; +end x14a; Property changes on: trunk/examples/ada/x14a.adb.cmake ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: trunk/examples/ada/x17a.adb.cmake =================================================================== --- trunk/examples/ada/x17a.adb.cmake (rev 0) +++ trunk/examples/ada/x17a.adb.cmake 2008-08-08 00:20:10 UTC (rev 8615) @@ -0,0 +1,188 @@ +-- $Id$ + +-- Plots a simple stripchart with four pens. + +-- Copyright (C) 2008 Jerry Bauck + +-- This file is part of PLplot. + +-- PLplot is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Library Public License as published +-- by the Free Software Foundation; either version 2 of the License, or +-- (at your option) any later version. + +-- PLplot is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Library General Public License for more details. + +-- You should have received a copy of the GNU Library General Public License +-- along with PLplot; if not, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +with + Ada.Text_IO, + Ada.Strings.Unbounded, + Ada.Numerics, + Ada.Numerics.Long_Elementary_Functions, + Ada.Numerics.Float_Random, + PLplot_Traditional, + PLplot_Auxiliary; +use + Ada.Text_IO, + Ada.Strings.Unbounded, + Ada.Numerics, + Ada.Numerics.Long_Elementary_Functions, + Ada.Numerics.Float_Random, + PLplot_Traditional, + PLplot_Auxiliary; + +-- COMMENT THIS LINE IF YOUR COMPILER DOES NOT INCLUDE THESE +-- DEFINITIONS, FOR EXAMPLE, IF IT IS NOT ADA 2005 WITH ANNEX G.3 COMPLIANCE. +--with Ada.Numerics.Long_Real_Arrays; use Ada.Numerics.Long_Real_Arrays; +@Ada_Is_2007_With_and_Use_Numerics@ + +procedure x17a is + autoy, acc : Boolean; + pl_errcode : Integer := 0; + id1 : Integer; + nsteps : Integer := 1000; + colbox, collab : Integer; + colline, styline : Integer_Array_1D(0 .. 3); + y1, y2, y3, y4, ymin, ymax, xlab, ylab : Long_Float; + t, tmin, tmax, tjump, dt, noise : Long_Float; + legline : Stripchart_Label_String_Array_Type := + (To_Unbounded_String("sum"), + To_Unbounded_String("sin"), + To_Unbounded_String("sin*noi"), + To_Unbounded_String("sin+noi")); + Random_Generator : Generator; -- From Ada.Numerics.Float_Random +begin + -- plplot initialization + -- Parse and process command line arguments + plparseopts(PL_PARSE_FULL); + + -- If db is used the plot is much more smooth. However, because of the + -- async X behaviour, one does not have a real-time scripcharter. + plsetopt("db", ""); + plsetopt("np", ""); + + -- User sets up plot completely except for window and data + -- Eventually settings in place when strip chart is created will be + -- remembered so that multiple strip charts can be used simultaneously. + + -- Specify some reasonable defaults for ymin and ymax + -- The plot will grow automatically if needed (but not shrink) + ymin := -0.1; + ymax := 0.1; + + -- Specify initial tmin and tmax -- this determines length of window. + -- Also specify maximum jump in t + -- This can accomodate adaptive timesteps + tmin := 0.0; + tmax := 10.0; + tjump := 0.3; -- percentage of plot to jump + + -- Axes options same as plbox. + -- Only automatic tick generation and label placement allowed. + -- Eventually I'll make this fancier. + colbox := 1; + collab := 3; + + styline(0) := 2; -- pens line style + styline(1) := 3; + styline(2) := 4; + styline(3) := 5; + + colline(0) := 2; -- pens color + colline(1) := 3; + colline(2) := 4; + colline(3) := 5; + + xlab := 0.0; -- legend position + ylab := 0.25; + + autoy := True; -- autoscale y + acc := True; -- don't scrip, accumulate + + -- Initialize plplot + plinit; + + pladv(0); + plvsta; + + -- Register our error variables with PLplot + -- From here on, we're handling all errors here + -- plsError(pl_errcode, errmsg); + + -- Ada note: plsError is not yet implemented in Ada. Thus, pl_errcode is + -- hardwired to 0 for now and no effective error handling is done. + + plstripc(id1, "bcnst", "bcnstv", + tmin, tmax, tjump, ymin, ymax, + xlab, ylab, + autoy, acc, + colbox, collab, + colline, styline, legline, + "t", "", "Strip chart demo"); + + -- Ada note: this would handle errors if error handling were implemented. + if pl_errcode /= 0 then + Put_Line("There was a problem which caused the program to quit."); + plend; + return; + end if; + + -- Let plplot handle errors from here on + -- plsError(NULL, NULL); + + autoy := False; -- autoscale y + acc := True; -- accumulate + + -- This is to represent a loop over time + -- Let's try a random walk process + y1 := 0.0; + y2 := 0.0; + y3 := 0.0; + y4 := 0.0; + + dt := 0.1; + + for n in 0 .. nsteps - 1 loop + -- The Ada standard requires that the delay statement have a granularity + -- of at most 20 ms but strongly recommends at most 100 microseconds. + -- We'll try 10 ms to match the C example, x17c, but in theory this + -- might fail to compile on some Ada systems. If so, the cure is to set + -- the delay to 0.02. + delay 0.01; -- wait a little (10 ms) to simulate time elapsing + t := Long_Float(n) * dt; + noise := Long_Float(Random(Random_Generator)) - 0.5; + y1 := y1 + noise; + y2 := sin(t * pi / 18.0); + y3 := y2 * noise; + y4 := y2 + noise / 3.0; + + -- There is no need for all pens to have the same number of + -- points or being equally time spaced. + if n mod 2 /= 0 then + plstripa(id1, 0, t, y1); + end if; + + if n mod 3 /= 0 then + plstripa(id1, 1, t, y2); + end if; + + if n mod 4 /= 0 then + plstripa(id1, 2, t, y3); + end if; + + if n mod 5 /= 0 then + plstripa(id1, 3, t, y4); + end if; + pleop; -- use double buffer (-db on command line) + end loop; + + -- Destroy strip chart and its memory + plstripd(id1); + plend; +end x17a; Property changes on: trunk/examples/ada/x17a.adb.cmake ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: trunk/examples/ada/xthick14a.adb.cmake =================================================================== --- trunk/examples/ada/xthick14a.adb.cmake (rev 0) +++ trunk/examples/ada/xthick14a.adb.cmake 2008-08-08 00:20:10 UTC (rev 8615) @@ -0,0 +1,371 @@ +-- $Id$ + +-- Demo of multiple stream/window capability (requires Tk or Tcl-DP). + +-- Maurice LeBrun +-- IFS, University of Texas at Austin + +-- Copyright (C) 2008 Jerry Bauck + +-- This file is part of PLplot. + +-- PLplot is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Library Public License as published +-- by the Free Software Foundation; either version 2 of the License, or +-- (at your option) any later version. + +-- PLplot is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Library General Public License for more details. + +-- You should have received a copy of the GNU Library General Public License +-- along with PLplot; if not, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +with + System, + Ada.Text_IO, + Ada.Strings, + Ada.Strings.Fixed, + Ada.Strings.Unbounded, + Ada.Numerics, + Ada.Numerics.Long_Elementary_Functions, + PLplot, + PLplot_Auxiliary; +use + Ada.Text_IO, + Ada.Numerics, + Ada.Strings, + Ada.Strings.Fixed, + Ada.Strings.Unbounded, + Ada.Numerics.Long_Elementary_Functions, + PLplot, + PLplot_Auxiliary; + +-- COMMENT THIS LINE IF YOUR COMPILER DOES NOT INCLUDE THESE +-- DEFINITIONS, FOR EXAMPLE, IF IT IS NOT ADA 2005 WITH ANNEX G.3 COMPLIANCE. +--with Ada.Numerics.Long_Real_Arrays; use Ada.Numerics.Long_Real_Arrays; +@Ada_Is_2007_With_and_Use_Numerics@ + +------------------------------------------------------------------------------ +-- Plots several simple functions from other example programs. +-- +-- This version sends the output of the first 4 plots (one page) to two +-- independent streams. +------------------------------------------------------------------------------ + +procedure xthick14a is + -- Select either TK or DP driver and use a small window + -- Using DP results in a crash at the end due to some odd cleanup problems + -- The geometry strings MUST be in writable memory + geometry_master : String := "500x410+100+200"; + geometry_slave : String := "500x410+650+200"; + driver : Unbounded_String; + digmax : Integer; + xscale, yscale, xoff, yoff : Long_Float; + xs, ys : Real_Vector(0 .. 5); + space0 : Integer_Array_1D(1 .. 1) := (Others => 0); + mark0 : Integer_Array_1D(1 .. 1) := (Others => 0); + space1 : Integer_Array_1D(1 .. 1) := (Others => 1500); + mark1 : Integer_Array_1D(1 .. 1) := (Others => 1500); + + procedure plot1 is + xmin, xmax, ymin, ymax : Long_Float; + x, y : Real_Vector(0 .. 59); + begin + for i in x'range loop + x(i) := xoff + xscale * Long_Float(i + 1) / Long_Float(x'Length); + y(i) := yoff + yscale * x(i) * x(i); + end loop; + + xmin := x(x'First); + xmax := x(x'Last); + ymin := y(y'First); + ymax := y(y'Last); + + for i in xs'range loop + xs(i) := x(i * 10 + 3); + ys(i) := y(i * 10 + 3); + end loop; + + -- Set up the viewport and window using PLENV. The range in X is + -- 0.0 to 6.0, and the range in Y is 0.0 to 30.0. The axes are + -- scaled separately (just := 0), and we just draw a labelled + -- box (axis := 0). + Set_Pen_Color(Red); + Set_Environment(xmin, xmax, ymin, ymax, Not_Justified, Linear_Box_Plus); + Set_Pen_Color(Wheat); + Write_Labels("(x)", "(y)", "#frPLplot Example 1 - y=x#u2"); + + -- Plot the data points + Set_Pen_Color(Blue); + Draw_Points(xs, ys, 9); + + -- Draw the line through the data + Set_Pen_Color(Aquamarine); + Draw_Curve(x, y); + Flush_Output_Stream; + end plot1; + + -- ================================================================ + + + procedure plot2 is + x, y : Real_Vector(0 .. 99); + begin + -- Set up the viewport and window using PLENV. The range in X is -2.0 to + -- 10.0, and the range in Y is -0.4 to 2.0. The axes are scaled separately + -- (just = 0), and we draw a box with axes (axis = 1). + Set_Pen_Color(Red); + Set_Environment(-2.0, 10.0, -0.4, 1.2, Not_Justified, Linear_Zero_Axes); + Set_Pen_Color(Yellow); + Write_Labels("(x)", "sin(x)/x", "#frPLplot Example 1 - Sinc Function"); + + -- Fill up the arrays + for i in x'range loop + x(i) := (Long_Float(i) - 19.0) / 6.0; + y(i) := 1.0; + if x(i) /= 0.0 then + y(i) := sin(x(i)) / x(i); + end if; + end loop; + + -- Draw the line + Set_Pen_Color(Green); + Draw_Curve(x, y); + Flush_Output_Stream; + end plot2; + + -- ================================================================ + + + procedure plot3 is + x, y : Real_Vector(0 .. 100); + begin + -- For the final graph we wish to override the default tick intervals, and + -- so do not use PLENV + + Advance_To_Subpage(Next_Subpage); + + -- Use standard viewport, and define X range from 0 to 360 degrees, Y range + -- from -1.2 to 1.2. + Set_Viewport_Standard; + Set_Viewport_World(0.0, 360.0, -1.2, 1.2); + + -- Draw a box with ticks spaced 60 degrees apart in X, and 0.2 in Y. + Set_Pen_Color(Red); + Box_Around_Viewport("bcnst", 60.0, 2, "bcnstv", 0.2, 2); + + -- Superimpose a dashed line grid, with 1.5 mm marks and spaces. + Set_Line_Style(mark1, space1); + Set_Pen_Color(Yellow); + Box_Around_Viewport("g", 30.0, 0, "g", 0.2, 0); + Set_Line_Style(Default_Continuous_Line); + + Set_Pen_Color(Green); + Write_Labels("Angle (degrees)", "sine", "#frPLplot Example 1 - Sine function"); + + for i in x'range loop + x(i) := 3.6 * Long_Float(i); + y(i) := sin(x(i) * pi / 180.0); + end loop; + + Set_Pen_Color(Aquamarine); + Draw_Curve(x, y); + Flush_Output_Stream; + end plot3; + + -- ================================================================ + + + procedure plot4 is + dtr, theta, dx, dy, r : Long_Float; + x, y, x0, y0 : Real_Vector(0 .. 360); + begin + dtr := pi / 180.0; + for i in x0'range loop + x0(i) := cos(dtr * Long_Float(i)); + y0(i) := sin(dtr * Long_Float(i)); + end loop; + + -- Set up viewport and window, but do not draw box + Set_Environment(-1.3, 1.3, -1.3, 1.3, Justified, No_Box); + for i in 1 .. 10 loop + for j in x'range loop + x(j) := 0.1 * Long_Float(i) * x0(j); + y(j) := 0.1 * Long_Float(i) * y0(j); + end loop; + + -- Draw circles for polar grid + Draw_Curve(x, y); + end loop; + + Set_Pen_Color(Yellow); + for i in 0 .. 11 loop + theta := 30.0 * Long_Float(i); + dx := cos(dtr * theta); + dy := sin(dtr * theta); + + -- Draw radial spokes for polar grid + Draw_Line(0.0, 0.0, dx, dy); + + -- Write labels for angle + -- Slightly off zero to avoid floating point logic flips at 90 and 270 deg. + if dx >= -0.00001 then + Write_Text_World(dx, dy, dx, dy, -0.15, Trim(Integer'image(Integer(theta)), Left)); + else + Write_Text_World(dx, dy, -dx, -dy, 1.15, Trim(Integer'image(Integer(theta)), Left)); + end if; + end loop; + + -- Draw the graph + for i in x'range loop + r := sin(dtr * Long_Float(5 * i)); + x(i) := x0(i) * r; + y(i) := y0(i) * r; + end loop; + Set_Pen_Color(Green); + Draw_Curve(x, y); + + Set_Pen_Color(Aquamarine); + Write_Text_Viewport("t", 2.0, 0.5, 0.5, "#frPLplot Example 3 - r(#gh)=sin 5#gh"); + Flush_Output_Stream; + end plot4; + + -- ================================================================ + + + -- Demonstration of contour plotting + procedure plot5 is + XPTS : constant Integer := 35; + YPTS : constant Integer := 46; + -- Transformation function + XSPA : Long_Float := 2.0 / Long_Float(XPTS - 1); + YSPA : Long_Float := 2.0 / Long_Float(YPTS - 1); + tr : Real_Vector(0 .. 5) := (XSPA, 0.0, -1.0, 0.0, YSPA, -1.0); + xx, yy : Long_Float; + mark : Integer_Array_1D(1 .. 1) := (Others => 1500); + space : Integer_Array_1D(1 .. 1) := (Others => 1500); + z, w : Real_Matrix(0 .. XPTS -1, 0 .. YPTS - 1); + clevel : Real_Vector(0 .. 10) := + (-1.0, -0.8, -0.6, -0.4, -0.2, 0.0, 0.2, 0.4, 0.6, 0.8, 1.0); + + procedure mypltr -- This spec is necessary to accommodate pragma Convention(C...). + (x, y : Long_Float; + tx, ty : out Long_Float; + pltr_data : PLpointer); + pragma Convention(Convention => C, Entity => mypltr); + + procedure mypltr + (x, y : Long_Float; + tx, ty : out Long_Float; + pltr_data : PLpointer) + is + begin + tx := tr(0) * x + tr(1) * y + tr(2); + ty := tr(3) * x + tr(4) * y + tr(5); + end mypltr; + + begin + for i in z'range(1) loop + xx := Long_Float(i - (XPTS / 2)) / Long_Float(XPTS / 2); + for j in z'range(2) loop + yy := Long_Float(j - (YPTS / 2)) / Long_Float(YPTS / 2) - 1.0; + z(i, j) := xx * xx - yy * yy; + w(i, j) := 2.0 * xx * yy; + end loop; + end loop; + + Set_Environment(-1.0, 1.0, -1.0, 1.0, Not_Justified, Linear_Box_Plus); + Set_Pen_Color(Yellow); + Contour_Plot(z, 1, XPTS, 1, YPTS, clevel, mypltr'Unrestricted_Access, System.Null_Address); + Set_Line_Style(mark, space); + Set_Pen_Color(Green); + Contour_Plot(w, 1, XPTS, 1, YPTS, clevel, mypltr'Unrestricted_Access, System.Null_Address); + Set_Pen_Color(Red); + Write_Labels("X Coordinate", "Y Coordinate", "Streamlines of flow"); + Flush_Output_Stream; + end plot5; + + +begin + -- plplot initialization + -- Parse and process command line arguments + Parse_Command_Line_Arguments(Parse_Full); + + driver := To_Unbounded_String(Get_Device_Name); + + Put_Line("Demo of multiple output streams via the " & Get_Device_Name & "driver."); + Put_Line("Running with the second stream as slave to the first."); + New_Line; + + -- Set up first stream + Set_Command_Line_Option("geometry", geometry_master); + + Set_Device_Name(To_String(driver)); + Set_Number_Of_Subpages(2, 2); + Initialize_PLplot; + + -- Start next stream + Set_Stream_Number(1); + + -- Turn off pause to make this a slave (must follow master) + Set_Command_Line_Option("geometry", geometry_slave); + Set_Pause(False); + Set_Device_Name(To_String(driver)); + Initialize_PLplot; + + -- Set up the data & plot + -- Original case + Set_Stream_Number(0); + + xscale := 6.0; + yscale := 1.0; + xoff := 0.0; + yoff := 0.0; + plot1; + + -- Set up the data & plot + xscale := 1.0; + yscale := 1.0e+6; + plot1; + + -- Set up the data & plot + xscale := 1.0; + yscale := 1.0e-6; + digmax := 2; + Set_Floating_Point_Display_Y(digmax, 0); + plot1; + + -- Set up the data & plot + xscale := 1.0; + yscale := 0.0014; + yoff := 0.0185; + digmax := 5; + Set_Floating_Point_Display_Y(digmax, 0); + plot1; + + -- To slave + -- The Eject_Current_Page ensures the eop indicator gets lit. + Set_Stream_Number(1); + plot4; + Eject_Current_Page; + + -- Back to master + Set_Stream_Number(0); + plot2; + plot3; + + -- To slave + Set_Stream_Number(1); + plot5; + Eject_Current_Page; + + -- Back to master to wait for user to advance + Set_Stream_Number(0); + Eject_Current_Page; + + -- Call End_PLplot to finish off. + End_PLplot; +end xthick14a; Property changes on: trunk/examples/ada/xthick14a.adb.cmake ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Added: trunk/examples/ada/xthick17a.adb.cmake =================================================================== --- trunk/examples/ada/xthick17a.adb.cmake (rev 0) +++ trunk/examples/ada/xthick17a.adb.cmake 2008-08-08 00:20:10 UTC (rev 8615) @@ -0,0 +1,188 @@ +-- $Id$ + +-- Plots a simple stripchart with four pens. + +-- Copyright (C) 2008 Jerry Bauck + +-- This file is part of PLplot. + +-- PLplot is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Library Public License as published +-- by the Free Software Foundation; either version 2 of the License, or +-- (at your option) any later version. + +-- PLplot is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU Library General Public License for more details. + +-- You should have received a copy of the GNU Library General Public License +-- along with PLplot; if not, write to the Free Software +-- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +with + Ada.Text_IO, + Ada.Strings.Unbounded, + Ada.Numerics, + Ada.Numerics.Long_Elementary_Functions, + Ada.Numerics.Float_Random, + PLplot, + PLplot_Auxiliary; +use + Ada.Text_IO, + Ada.Strings.Unbounded, + Ada.Numerics, + Ada.Numerics.Long_Elementary_Functions, + Ada.Numerics.Float_Random, + PLplot, + PLplot_Auxiliary; + +-- COMMENT THIS LINE IF YOUR COMPILER DOES NOT INCLUDE THESE +-- DEFINITIONS, FOR EXAMPLE, IF IT IS NOT ADA 2005 WITH ANNEX G.3 COMPLIANCE. +--with Ada.Numerics.Long_Real_Arrays; use Ada.Numerics.Long_Real_Arrays; +@Ada_Is_2007_With_and_Use_Numerics@ + +procedure xthick17a is + autoy, acc : Boolean; + pl_errcode : Integer := 0; + id1 : Integer; + nsteps : Integer := 1000; + colbox, collab : Integer; + colline, styline : Integer_Array_1D(0 .. 3); + y1, y2, y3, y4, ymin, ymax, xlab, ylab : Long_Float; + t, tmin, tmax, tjump, dt, noise : Long_Float; + legline : Stripchart_Label_String_Array_Type := + (To_Unbounded_String("sum"), + To_Unbounded_String("sin"), + To_Unbounded_String("sin*noi"), + To_Unbounded_String("sin+noi")); + Random_Generator : Generator; -- From Ada.Numerics.Float_Random +begin + -- plplot initialization + -- Parse and process command line arguments + Parse_Command_Line_Arguments(Parse_Full); + + -- If db is used the plot is much more smooth. However, because of the + -- async X behaviour, one does not have a real-time scripcharter. + Set_Command_Line_Option("db", ""); + Set_Command_Line_Option("np", ""); + + -- User sets up plot completely except for window and data + -- Eventually settings in place when strip chart is created will be + -- remembered so that multiple strip charts can be used simultaneously. + + -- Specify some reasonable defaults for ymin and ymax + -- The plot will grow automatically if needed (but not shrink) + ymin := -0.1; + ymax := 0.1; + + -- Specify initial tmin and tmax -- this determines length of window. + -- Also specify maximum jump in t + -- This can accomodate adaptive timesteps + tmin := 0.0; + tmax := 10.0; + tjump := 0.3; -- percentage of plot to jump + + -- Axes options same as Box_Around_Viewport. + -- Only automatic tick generation and label placement allowed. + -- Eventually I'll make this fancier. + colbox := 1; + collab := 3; + + styline(0) := 2; -- pens line style + styline(1) := 3; + styline(2) := 4; + styline(3) := 5; + + colline(0) := 2; -- pens color + colline(1) := 3; + colline(2) := 4; + colline(3) := 5; + + xlab := 0.0; -- legend position + ylab := 0.25; + + autoy := True; -- autoscale y + acc := True; -- don't scrip, accumulate + + -- Initialize plplot + Initialize_PLplot; + + Advance_To_Subpage(Next_Subpage); + Set_Viewport_Standard; + + -- Register our error variables with PLplot + -- From here on, we're handling all errors here + -- plsError(pl_errcode, errmsg); + + -- Ada note: plsError is not yet implemented in Ada. Thus, pl_errcode is + -- hardwired to 0 for now and no effective error handling is done. + + Create_Stripchart(id1, "bcnst", "bcnstv", + tmin, tmax, tjump, ymin, ymax, + xlab, ylab, + autoy, acc, + colbox, collab, + colline, styline, legline, + "t", "", "Strip chart demo"); + + -- Ada note: this would handle errors if error handling were implemented. + if pl_errcode /= 0 then + Put_Line("There was a problem which caused the program to quit."); + End_PLplot; + return; + end if; + + -- Let plplot handle errors from here on + -- plsError(NULL, NULL); + + autoy := False; -- autoscale y + acc := True; -- accumulate + + -- This is to represent a loop over time + -- Let's try a random walk process + y1 := 0.0; + y2 := 0.0; + y3 := 0.0; + y4 := 0.0; + + dt := 0.1; + + for n in 0 .. nsteps - 1 loop + -- The Ada standard requires that the delay statement have a granularity + -- of at most 20 ms but strongly recommends at most 100 microseconds. + -- We'll try 10 ms to match the C example, x17c, but in theory this + -- might fail to compile on some Ada systems. If so, the cure is to set + -- the delay to 0.02. + delay 0.01; -- wait a little (10 ms) to simulate time elapsing + t := Long_Float(n) * dt; + noise := Long_Float(Random(Random_Generator)) - 0.5; + y1 := y1 + noise; + y2 := sin(t * pi / 18.0); + y3 := y2 * noise; + y4 := y2 + noise / 3.0; + + -- There is no need for all pens to have the same number of + -- points or being equally time spaced. + if n mod 2 /= 0 then + Update_Stripchart(id1, 0, t, y1); + end if; + + if n mod 3 /= 0 then + Update_Stripchart(id1, 1, t, y2); + end if; + + if n mod 4 /= 0 then + Update_Stripchart(id1, 2, t, y3); + end if; + + if n mod 5 /= 0 then + Update_Stripchart(id1, 3, t, y4); + end if; + Eject_Current_Page; -- use double buffer (-db on command line) + end loop; + + -- Destroy strip chart and its memory + Delete_Stripchart(id1); + End_PLplot; +end xthick17a; Property changes on: trunk/examples/ada/xthick17a.adb.cmake ___________________________________________________________________ Added: svn:keywords + Author Date Id Revision Added: svn:eol-style + native Modified: trunk/plplot_test/test_ada.sh.in =================================================================== --- trunk/plplot_test/test_ada.sh.in 2008-08-07 22:04:50 UTC (rev 8614) +++ trunk/plplot_test/test_ada.sh.in 2008-08-08 00:20:10 UTC (rev 8615) @@ -29,10 +29,10 @@ # Do the standard non-interactive examples. for index in \ 01 02 03 04 05 06 07 08 09 \ -10 11 12 13 15 16 18 19 \ +10 11 12 13 14 15 16 17 18 19 \ 21 22 23 24 25 26 27 28 29 30 \ thick01 thick02 thick03 thick04 thick05 thick06 thick07 thick08 thick09 \ -thick10 thick11 thick12 thick13 thick15 thick16 thick18 thick19 \ +thick10 thick11 thick12 thick13 thick14 thick15 thick16 thick17 thick18 thick19 \ thick21 thick22 thick23 thick24 thick25 thick26 thick27 thick28 thick29 thick30; do $adadir/x${index}a -dev $device -o ${OUTPUT_DIR}/x${index}a.$dsuffix $options 2> test.error status_code=$? This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |