aboutsummaryrefslogtreecommitdiff
path: root/src/algebra/view2D.spad.pamphlet
diff options
context:
space:
mode:
Diffstat (limited to 'src/algebra/view2D.spad.pamphlet')
-rw-r--r--src/algebra/view2D.spad.pamphlet1170
1 files changed, 1170 insertions, 0 deletions
diff --git a/src/algebra/view2D.spad.pamphlet b/src/algebra/view2D.spad.pamphlet
new file mode 100644
index 00000000..5676019e
--- /dev/null
+++ b/src/algebra/view2D.spad.pamphlet
@@ -0,0 +1,1170 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/algebra view2D.spad}
+\author{James Wen}
+\maketitle
+\begin{abstract}
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+\section{domain GRIMAGE GraphImage}
+<<domain GRIMAGE GraphImage>>=
+)abbrev domain GRIMAGE GraphImage
+++ Author: Jim Wen
+++ Date Created: 27 April 1989
+++ Date Last Updated: 1995 September 20, Mike Richardson (MGR)
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description: TwoDimensionalGraph creates virtual two dimensional graphs
+++ (to be displayed on TwoDimensionalViewports).
+GraphImage (): Exports == Implementation where
+
+ VIEW ==> VIEWPORTSERVER$Lisp
+ sendI ==> SOCK_-SEND_-INT
+ sendSF ==> SOCK_-SEND_-FLOAT
+ sendSTR ==> SOCK_-SEND_-STRING
+ getI ==> SOCK_-GET_-INT
+ getSF ==> SOCK_-GET_-FLOAT
+
+ typeGRAPH ==> 2
+ typeVIEW2D ==> 3
+
+ makeGRAPH ==> (-1)$SingleInteger
+ makeVIEW2D ==> (-1)$SingleInteger
+
+ I ==> Integer
+ PI ==> PositiveInteger
+ NNI ==> NonNegativeInteger
+ SF ==> DoubleFloat
+ F ==> Float
+ L ==> List
+ P ==> Point(SF)
+ V ==> Vector
+ SEG ==> Segment
+ RANGESF ==> L SEG SF
+ RANGEF ==> L SEG F
+ UNITSF ==> L SF
+ UNITF ==> L F
+ PAL ==> Palette
+ E ==> OutputForm
+ DROP ==> DrawOption
+ PP ==> PointPackage(SF)
+ COORDSYS ==> CoordinateSystems(SF)
+
+ Exports ==> SetCategory with
+ graphImage : () -> $
+ ++ graphImage() returns an empty graph with 0 point lists
+ ++ of the domain \spadtype{GraphImage}. A graph image contains
+ ++ the graph data component of a two dimensional viewport.
+ makeGraphImage : $ -> $
+ ++ makeGraphImage(gi) takes the given graph, \spad{gi} of the
+ ++ domain \spadtype{GraphImage}, and sends it's data to the
+ ++ viewport manager where it waits to be included in a two-dimensional
+ ++ viewport window. \spad{gi} cannot be an empty graph, and it's
+ ++ elements must have been created using the \spadfun{point} or
+ ++ \spadfun{component} functions, not by a previous
+ ++ \spadfun{makeGraphImage}.
+ makeGraphImage : (L L P) -> $
+ ++ makeGraphImage(llp) returns a graph of the domain
+ ++ \spadtype{GraphImage} which is composed of the points and
+ ++ lines from the list of lists of points, \spad{llp}, with
+ ++ default point size and default point and line colours. The graph
+ ++ data is then sent to the viewport manager where it waits to be
+ ++ included in a two-dimensional viewport window.
+ makeGraphImage : (L L P,L PAL,L PAL,L PI) -> $
+ ++ makeGraphImage(llp,lpal1,lpal2,lp) returns a graph of the
+ ++ domain \spadtype{GraphImage} which is composed of the points
+ ++ and lines from the list of lists of points, \spad{llp}, whose
+ ++ point colors are indicated by the list of palette colors,
+ ++ \spad{lpal1}, and whose lines are colored according to the list
+ ++ of palette colors, \spad{lpal2}. The paramater lp is a list of
+ ++ integers which denote the size of the data points. The graph
+ ++ data is then sent to the viewport manager where it waits to be
+ ++ included in a two-dimensional viewport window.
+ makeGraphImage : (L L P,L PAL,L PAL,L PI,L DROP) -> $
+ ++ makeGraphImage(llp,lpal1,lpal2,lp,lopt) returns a graph of
+ ++ the domain \spadtype{GraphImage} which is composed of the
+ ++ points and lines from the list of lists of points, \spad{llp},
+ ++ whose point colors are indicated by the list of palette colors,
+ ++ \spad{lpal1}, and whose lines are colored according to the list
+ ++ of palette colors, \spad{lpal2}. The paramater lp is a list of
+ ++ integers which denote the size of the data points, and \spad{lopt}
+ ++ is the list of draw command options. The graph data is then sent
+ ++ to the viewport manager where it waits to be included in a
+ ++ two-dimensional viewport window.
+ pointLists : $ -> L L P
+ ++ pointLists(gi) returns the list of lists of points which compose
+ ++ the given graph, \spad{gi}, of the domain \spadtype{GraphImage}.
+ key : $ -> I
+ ++ key(gi) returns the process ID of the given graph, \spad{gi},
+ ++ of the domain \spadtype{GraphImage}.
+ ranges : $ -> RANGEF
+ ++ ranges(gi) returns the list of ranges of the point components from
+ ++ the indicated graph, \spad{gi}, of the domain \spadtype{GraphImage}.
+ ranges : ($,RANGEF) -> RANGEF
+ ++ ranges(gi,lr) modifies the list of ranges for the given graph,
+ ++ \spad{gi} of the domain \spadtype{GraphImage}, to be that of the
+ ++ list of range segments, \spad{lr}, and returns the new range list
+ ++ for \spad{gi}.
+ units : $ -> UNITF
+ ++ units(gi) returns the list of unit increments for the x and y
+ ++ axes of the indicated graph, \spad{gi}, of the domain
+ ++ \spadtype{GraphImage}.
+ units : ($,UNITF) -> UNITF
+ ++ units(gi,lu) modifies the list of unit increments for the x and y
+ ++ axes of the given graph, \spad{gi} of the domain
+ ++ \spadtype{GraphImage}, to be that of the list of unit increments,
+ ++ \spad{lu}, and returns the new list of units for \spad{gi}.
+ component : ($,L P,PAL,PAL,PI) -> Void
+ ++ component(gi,lp,pal1,pal2,p) sets the components of the
+ ++ graph, \spad{gi} of the domain \spadtype{GraphImage}, to the
+ ++ values given. The point list for \spad{gi} is set to the list
+ ++ \spad{lp}, the color of the points in \spad{lp} is set to
+ ++ the palette color \spad{pal1}, the color of the lines which
+ ++ connect the points \spad{lp} is set to the palette color
+ ++ \spad{pal2}, and the size of the points in \spad{lp} is given
+ ++ by the integer p.
+ component : ($,P) -> Void
+ ++ component(gi,pt) modifies the graph \spad{gi} of the domain
+ ++ \spadtype{GraphImage} to contain one point component, \spad{pt}
+ ++ whose point color, line color and point size are determined by
+ ++ the default functions \spadfun{pointColorDefault},
+ ++ \spadfun{lineColorDefault}, and \spadfun{pointSizeDefault}.
+ component : ($,P,PAL,PAL,PI) -> Void
+ ++ component(gi,pt,pal1,pal2,ps) modifies the graph \spad{gi} of
+ ++ the domain \spadtype{GraphImage} to contain one point component,
+ ++ \spad{pt} whose point color is set to the palette color \spad{pal1},
+ ++ line color is set to the palette color \spad{pal2}, and point
+ ++ size is set to the positive integer \spad{ps}.
+ appendPoint : ($,P) -> Void
+ ++ appendPoint(gi,pt) appends the point \spad{pt} to the end
+ ++ of the list of points component for the graph, \spad{gi}, which is
+ ++ of the domain \spadtype{GraphImage}.
+ point : ($,P,PAL) -> Void
+ ++ point(gi,pt,pal) modifies the graph \spad{gi} of the domain
+ ++ \spadtype{GraphImage} to contain one point component, \spad{pt}
+ ++ whose point color is set to be the palette color \spad{pal}, and
+ ++ whose line color and point size are determined by the default
+ ++ functions \spadfun{lineColorDefault} and \spadfun{pointSizeDefault}.
+ coerce : L L P -> $
+ ++ coerce(llp)
+ ++ component(gi,pt) creates and returns a graph of the domain
+ ++ \spadtype{GraphImage} which is composed of the list of list
+ ++ of points given by \spad{llp}, and whose point colors, line colors
+ ++ and point sizes are determined by the default functions
+ ++ \spadfun{pointColorDefault}, \spadfun{lineColorDefault}, and
+ ++ \spadfun{pointSizeDefault}. The graph data is then sent to the
+ ++ viewport manager where it waits to be included in a two-dimensional
+ ++ viewport window.
+ coerce : $ -> E
+ ++ coerce(gi) returns the indicated graph, \spad{gi}, of domain
+ ++ \spadtype{GraphImage} as output of the domain \spadtype{OutputForm}.
+ putColorInfo : (L L P,L PAL) -> L L P
+ ++ putColorInfo(llp,lpal) takes a list of list of points, \spad{llp},
+ ++ and returns the points with their hue and shade components
+ ++ set according to the list of palette colors, \spad{lpal}.
+ figureUnits : L L P -> UNITSF
+
+ Implementation ==> add
+ import Color()
+ import Palette()
+ import ViewDefaultsPackage()
+ import PlotTools()
+ import DrawOptionFunctions0
+ import P
+ import PP
+ import COORDSYS
+
+ Rep := Record(key: I, rangesField: RANGESF, unitsField: UNITSF, _
+ llPoints: L L P, pointColors: L PAL, lineColors: L PAL, pointSizes: L PI, _
+ optionsField: L DROP)
+
+--%Internal Functions
+
+ graph : RANGEF -> $
+ scaleStep : SF -> SF
+ makeGraph : $ -> $
+
+
+ numberCheck(nums:Point SF):Void ==
+ for i in minIndex(nums)..maxIndex(nums) repeat
+ COMPLEXP(nums.(i::PositiveInteger))$Lisp =>
+ error "An unexpected complex number was encountered in the calculations."
+
+
+ doOptions(g:Rep):Void ==
+ lr : RANGEF := ranges(g.optionsField,ranges g)
+ if (#lr > 1$I) then
+ g.rangesField := [segment(convert(lo(lr.1))@SF,convert(hi(lr.1))@SF)$(Segment(SF)),
+ segment(convert(lo(lr.2))@SF,convert(hi(lr.2))@SF)$(Segment(SF))]
+ else
+ g.rangesField := []
+ lu : UNITF := units(g.optionsField,units g)
+ if (#lu > 1$I) then
+ g.unitsField := [convert(lu.1)@SF,convert(lu.2)@SF]
+ else
+ g.unitsField := []
+ -- etc - graphimage specific stuff...
+
+ putColorInfo(llp,listOfPalettes) ==
+ llp2 : L L P := []
+ for lp in llp for pal in listOfPalettes repeat
+ lp2 : L P := []
+ daHue := (hue(hue pal))::SF
+ daShade := (shade pal)::SF
+ for p in lp repeat
+ if (d := dimension p) < 3 then
+ p := extend(p,[daHue,daShade])
+ else
+ p.3 := daHue
+ d < 4 => p := extend(p,[daShade])
+ p.4 := daShade
+ lp2 := cons(p,lp2)
+ llp2 := cons(reverse_! lp2,llp2)
+ reverse_! llp2
+
+ graph demRanges ==
+ null demRanges => [ 0, [], [], [], [], [], [], [] ]
+ demRangesSF : RANGESF := _
+ [ segment(convert(lo demRanges.1)@SF,convert(hi demRanges.1)@SF)$(Segment(SF)), _
+ segment(convert(lo demRanges.1)@SF,convert(hi demRanges.1)@SF)$(Segment(SF)) ]
+ [ 0, demRangesSF, [], [], [], [], [], [] ]
+
+ scaleStep(range) == -- MGR
+
+ adjust:NNI
+ tryStep:SF
+ scaleDown:SF
+ numerals:String
+ adjust := 0
+ while range < 100.0::SF repeat
+ adjust := adjust + 1
+ range := range * 10.0::SF -- might as well take big steps
+ tryStep := range/10.0::SF
+ numerals := string(((retract(ceiling(tryStep)$SF)$SF)@I))$String
+ scaleDown := (10@I **$I (((#(numerals)@I) - 1$I) pretend PI))::SF
+ scaleDown*ceiling(tryStep/scaleDown - 0.5::SF)/((10 **$I adjust)::SF)
+
+ figureUnits(listOfListsOfPoints) ==
+ -- figure out the min/max and divide by 10 for unit markers
+ xMin := xMax := xCoord first first listOfListsOfPoints
+ yMin := yMax := yCoord first first listOfListsOfPoints
+ if xMin ~= xMin then xMin:=max()
+ if xMax ~= xMax then xMax:=min()
+ if yMin ~= yMin then yMin:=max()
+ if yMax ~= yMax then yMax:=min()
+ for pL in listOfListsOfPoints repeat
+ for p in pL repeat
+ if ((px := (xCoord p)) < xMin) then
+ xMin := px
+ if px > xMax then
+ xMax := px
+ if ((py := (yCoord p)) < yMin) then
+ yMin := py
+ if py > yMax then
+ yMax := py
+ if xMin = xMax then
+ xMin := xMin - convert(0.5)$Float
+ xMax := xMax + convert(0.5)$Float
+ if yMin = yMax then
+ yMin := yMin - convert(0.5)$Float
+ yMax := yMax + convert(0.5)$Float
+ [scaleStep(xMax-xMin),scaleStep(yMax-yMin)]
+
+ plotLists(graf:Rep,listOfListsOfPoints:L L P,listOfPointColors:L PAL,listOfLineColors:L PAL,listOfPointSizes:L PI):$ ==
+ givenLen := #listOfListsOfPoints
+ -- take out point lists that are actually empty
+ listOfListsOfPoints := [ l for l in listOfListsOfPoints | ^null l ]
+ if (null listOfListsOfPoints) then
+ error "GraphImage was given a list that contained no valid point lists"
+ if ((len := #listOfListsOfPoints) ^= givenLen) then
+ sayBrightly([" Warning: Ignoring pointless point list"::E]$List(E))$Lisp
+ graf.llPoints := listOfListsOfPoints
+ -- do point colors
+ if ((givenLen := #listOfPointColors) > len) then
+ -- pad or discard elements if given list has length different from the point list
+ graf.pointColors := concat(listOfPointColors,
+ new((len - givenLen)::NonNegativeInteger + 1, pointColorDefault()))
+ else graf.pointColors := first(listOfPointColors, len)
+ -- do line colors
+ if ((givenLen := #listOfLineColors) > len) then
+ graf.lineColors := concat(listOfLineColors,
+ new((len - givenLen)::NonNegativeInteger + 1, lineColorDefault()))
+ else graf.lineColors := first(listOfLineColors, len)
+ -- do point sizes
+ if ((givenLen := #listOfPointSizes) > len) then
+ graf.pointSizes := concat(listOfPointSizes,
+ new((len - givenLen)::NonNegativeInteger + 1, pointSizeDefault()))
+ else graf.pointSizes := first(listOfPointSizes, len)
+ graf
+
+ makeGraph graf ==
+ doOptions(graf)
+ (s := #(graf.llPoints)) = 0 =>
+ error "You are trying to make a graph with no points"
+ key graf ^= 0 =>
+ error "You are trying to draw over an existing graph"
+ transform := coord(graf.optionsField,cartesian$COORDSYS)$DrawOptionFunctions0
+ graf.llPoints:= putColorInfo(graf.llPoints,graf.pointColors)
+ if null(ranges graf) then -- figure out best ranges for points
+ graf.rangesField := calcRanges(graf.llPoints) --::V SEG SF
+ if null(units graf) then -- figure out best ranges for points
+ graf.unitsField := figureUnits(graf.llPoints) --::V SEG SF
+ sayBrightly([" Graph data being transmitted to the viewport manager..."::E]$List(E))$Lisp
+ sendI(VIEW,typeGRAPH)$Lisp
+ sendI(VIEW,makeGRAPH)$Lisp
+ tonto := (graf.rangesField)::RANGESF
+ sendSF(VIEW,lo(first tonto))$Lisp
+ sendSF(VIEW,hi(first tonto))$Lisp
+ sendSF(VIEW,lo(second tonto))$Lisp
+ sendSF(VIEW,hi(second tonto))$Lisp
+ sendSF(VIEW,first (graf.unitsField))$Lisp
+ sendSF(VIEW,second (graf.unitsField))$Lisp
+ sendI(VIEW,s)$Lisp -- how many lists of points are being sent
+ for aList in graf.llPoints for pColor in graf.pointColors for lColor in graf.lineColors for s in graf.pointSizes repeat
+ sendI(VIEW,#aList)$Lisp -- how many points in this list
+ for p in aList repeat
+ aPoint := transform p
+ sendSF(VIEW,xCoord aPoint)$Lisp
+ sendSF(VIEW,yCoord aPoint)$Lisp
+ sendSF(VIEW,hue(p)$PP)$Lisp -- ?use aPoint as well...?
+ sendSF(VIEW,shade(p)$PP)$Lisp
+ hueShade := hue hue pColor + shade pColor * numberOfHues()
+ sendI(VIEW,hueShade)$Lisp
+ hueShade := (hue hue lColor -1)*5 + shade lColor
+ sendI(VIEW,hueShade)$Lisp
+ sendI(VIEW,s)$Lisp
+ graf.key := getI(VIEW)$Lisp
+ graf
+
+
+--%Exported Functions
+ makeGraphImage(graf:$) == makeGraph graf
+ key graf == graf.key
+ pointLists graf == graf.llPoints
+ ranges graf ==
+ null graf.rangesField => []
+ [segment(convert(lo graf.rangesField.1)@F,convert(hi graf.rangesField.1)@F), _
+ segment(convert(lo graf.rangesField.2)@F,convert(hi graf.rangesField.2)@F)]
+ ranges(graf,rangesList) ==
+ graf.rangesField :=
+ [segment(convert(lo rangesList.1)@SF,convert(hi rangesList.1)@SF), _
+ segment(convert(lo rangesList.2)@SF,convert(hi rangesList.2)@SF)]
+ rangesList
+ units graf ==
+ null(graf.unitsField) => []
+ [convert(graf.unitsField.1)@F,convert(graf.unitsField.2)@F]
+ units (graf,unitsToBe) ==
+ graf.unitsField := [convert(unitsToBe.1)@SF,convert(unitsToBe.2)@SF]
+ unitsToBe
+ graphImage == graph []
+
+ makeGraphImage(llp) ==
+ makeGraphImage(llp,
+ [pointColorDefault() for i in 1..(l:=#llp)],
+ [lineColorDefault() for i in 1..l],
+ [pointSizeDefault() for i in 1..l])
+
+ makeGraphImage(llp,lpc,llc,lps) ==
+ makeGraphImage(llp,lpc,llc,lps,[])
+
+ makeGraphImage(llp,lpc,llc,lps,opts) ==
+ graf := graph(ranges(opts,[]))
+ graf.optionsField := opts
+ graf := plotLists(graf,llp,lpc,llc,lps)
+ transform := coord(graf.optionsField,cartesian$COORDSYS)$DrawOptionFunctions0
+ for aList in graf.llPoints repeat
+ for p in aList repeat
+ aPoint := transform p
+ numberCheck aPoint
+ makeGraph graf
+
+ component (graf:$,ListOfPoints:L P,PointColor:PAL,LineColor:PAL,PointSize:PI) ==
+ graf.llPoints := append(graf.llPoints,[ListOfPoints])
+ graf.pointColors := append(graf.pointColors,[PointColor])
+ graf.lineColors := append(graf.lineColors,[LineColor])
+ graf.pointSizes := append(graf.pointSizes,[PointSize])
+
+ component (graf,aPoint) ==
+ component(graf,aPoint,pointColorDefault(),lineColorDefault(),pointSizeDefault())
+
+ component (graf:$,aPoint:P,PointColor:PAL,LineColor:PAL,PointSize:PI) ==
+ component (graf,[aPoint],PointColor,LineColor,PointSize)
+
+ appendPoint (graf,aPoint) ==
+ num : I := #(graf.llPoints) - 1
+ num < 0 => error "No point lists to append to!"
+ (graf.llPoints.num) := append((graf.llPoints.num),[aPoint])
+
+ point (graf,aPoint,PointColor) ==
+ component(graf,aPoint,PointColor,lineColorDefault(),pointSizeDefault())
+
+ coerce (llp : L L P) : $ ==
+ makeGraphImage(llp,
+ [pointColorDefault() for i in 1..(l:=#llp)],
+ [lineColorDefault() for i in 1..l],
+ [pointSizeDefault() for i in 1..l])
+
+ coerce (graf : $) : E ==
+ hconcat( ["Graph with " :: E,(p := # pointLists graf) :: E,
+ (p=1 => " point list"; " point lists") :: E])
+
+@
+\section{domain VIEW2D TwoDimensionalViewport}
+\subsection{Creating multiple graphs in a Viewport}
+We want to graph $x^3 * (a+b*x)$ on the interval $x=-1\ldots1$
+so we clear out the workspace
+<<multigraph.input>>=
+)clear all
+@
+We assign values to the constants
+<<multigraph.input>>=
+a:=0.5
+b:=0.5
+@
+We draw the first case of the graph
+<<multigraph.input>>=
+y1:=draw(x^3*(a+b*x),x=-1..1,title=="2.2.10 explicit")
+@
+We fetch the graph of the first object
+<<multigraph.input>>=
+g1:=getGraph(y1,1)
+@
+We extract its points
+<<multigraph.input>>=
+pointLists g1
+@
+
+Now we create a second graph with a changed parameter
+<<multigraph.input>>=
+b:=1.0
+@
+We draw it
+<<multigraph.input>>=
+y2:=draw(x^3*(a+b*x),x=-1..1)
+@
+We fetch this new graph
+<<multigraph.input>>=
+g2:=getGraph(y2,1)
+@
+We get the points from this graph
+<<multigraph.input>>=
+pointLists g2
+@
+and we put these points, $g2$ onto the first graph $y1$ as graph $2$
+<<multigraph.input>>=
+putGraph(y1,g2,2)
+@
+And now we do the whole sequence again
+<<multigraph.input>>=
+b:=2.0
+y3:=draw(x^3*(a+b*x),x=-1..1)
+g3:=getGraph(y3,1)
+pointLists g3
+@
+and put the third graphs points $g3$ onto the first graph $y1$ as graph $3$
+<<multigraph.input>>=
+putGraph(y1,g3,3)
+@
+Finally we show the combined result
+<<multigraph.input>>=
+vp:=makeViewport2D(y1)
+@
+<<domain VIEW2D TwoDimensionalViewport>>=
+)abbrev domain VIEW2D TwoDimensionalViewport
+++ Author: Jim Wen
+++ Date Created: 28 April 1989
+++ Date Last Updated: 29 October 1991, Jon Steinbach
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description: TwoDimensionalViewport creates viewports to display graphs.
+TwoDimensionalViewport ():Exports == Implementation where
+
+ VIEW ==> VIEWPORTSERVER$Lisp
+ sendI ==> SOCK_-SEND_-INT
+ sendSF ==> SOCK_-SEND_-FLOAT
+ sendSTR ==> SOCK_-SEND_-STRING
+ getI ==> SOCK_-GET_-INT
+ getSF ==> SOCK_-GET_-FLOAT
+
+ typeGRAPH ==> 2
+ typeVIEW2D ==> 3
+
+ makeGRAPH ==> (-1)$SingleInteger
+ makeVIEW2D ==> (-1)$SingleInteger
+
+ I ==> Integer
+ PI ==> PositiveInteger
+ NNI ==> NonNegativeInteger
+ XY ==> Record( X:I, Y:I )
+ XYP ==> Record( X:PI, Y:PI )
+ XYNN ==> Record( X:NNI, Y:NNI )
+ F ==> Float
+ SF ==> DoubleFloat
+ STR ==> String
+ L ==> List
+ V ==> Vector
+ E ==> OutputForm
+ FLAG ==> Record( showCP:I )
+ PAL ==> Palette()
+ B ==> Boolean
+ G ==> GraphImage
+ GS ==> Record( scaleX:SF, scaleY:SF, deltaX:SF, deltaY:SF, _
+ points:I, connect:I, spline:I, _
+ axes:I, axesColor:PAL, units:I, unitsColor:PAL, _
+ showing:I)
+ GU ==> Union(G,"undefined")
+ DROP ==> DrawOption
+ POINT ==> Point(SF)
+
+ TRANSLATE2D ==> 0$I
+ SCALE2D ==> 1$I
+ pointsOnOff ==> 2
+ connectOnOff ==> 3
+ spline2D ==> 4 -- used for controlling regions, now
+ reset2D ==> 5
+ hideControl2D ==> 6
+ closeAll2D ==> 7
+ axesOnOff2D ==> 8
+ unitsOnOff2D ==> 9
+
+ SPADBUTTONPRESS ==> 100
+ MOVE ==> 102
+ RESIZE ==> 103
+ TITLE ==> 104
+ showing2D ==> 105 -- as defined in include/actions.h
+ putGraph2D ==> 106
+ writeView ==> 110
+ axesColor2D ==> 112
+ unitsColor2D ==> 113
+ getPickedPTS ==> 119
+
+ graphStart ==> 13 -- as defined in include/actions.h
+
+ noControl ==> 0$I
+
+ yes ==> 1$I
+ no ==> 0$I
+
+ maxGRAPHS ==> 9::I -- should be the same as maxGraphs in include/view2D.h
+
+ fileTypeDefs ==> ["PIXMAP"] -- see include/write.h for things to include
+
+ Exports ==> SetCategory with
+ getPickedPoints : $ -> L POINT
+ ++ getPickedPoints(x)
+ ++ returns a list of small floats for the points the
+ ++ user interactively picked on the viewport
+ ++ for full integration into the system, some design
+ ++ issues need to be addressed: e.g. how to go through
+ ++ the GraphImage interface, how to default to graphs, etc.
+ viewport2D : () -> $
+ ++ viewport2D() returns an undefined two-dimensional viewport
+ ++ of the domain \spadtype{TwoDimensionalViewport} whose
+ ++ contents are empty.
+ makeViewport2D : $ -> $
+ ++ makeViewport2D(v) takes the given two-dimensional viewport,
+ ++ v, of the domain \spadtype{TwoDimensionalViewport} and
+ ++ displays a viewport window on the screen which contains
+ ++ the contents of v.
+ options : $ -> L DROP
+ ++ options(v) takes the given two-dimensional viewport, v, of the
+ ++ domain \spadtype{TwoDimensionalViewport} and returns a list
+ ++ containing the draw options from the domain \spadtype{DrawOption}
+ ++ for v.
+ options : ($,L DROP) -> $
+ ++ options(v,lopt) takes the given two-dimensional viewport, v,
+ ++ of the domain \spadtype{TwoDimensionalViewport} and returns
+ ++ v with it's draw options modified to be those which are indicated
+ ++ in the given list, \spad{lopt} of domain \spadtype{DrawOption}.
+ makeViewport2D : (G,L DROP) -> $
+ ++ makeViewport2D(gi,lopt) creates and displays a viewport window
+ ++ of the domain \spadtype{TwoDimensionalViewport} whose graph
+ ++ field is assigned to be the given graph, \spad{gi}, of domain
+ ++ \spadtype{GraphImage}, and whose options field is set to be
+ ++ the list of options, \spad{lopt} of domain \spadtype{DrawOption}.
+ graphState : ($,PI,SF,SF,SF,SF,I,I,I,I,PAL,I,PAL,I) -> Void
+ ++ graphState(v,num,sX,sY,dX,dY,pts,lns,box,axes,axesC,un,unC,cP)
+ ++ sets the state of the characteristics for the graph indicated
+ ++ by \spad{num} in the given two-dimensional viewport v, of domain
+ ++ \spadtype{TwoDimensionalViewport}, to the values given as
+ ++ parameters. The scaling of the graph in the x and y component
+ ++ directions is set to be \spad{sX} and \spad{sY}; the window
+ ++ translation in the x and y component directions is set to be
+ ++ \spad{dX} and \spad{dY}; The graph points, lines, bounding box,
+ ++ axes, or units will be shown in the viewport if their given
+ ++ parameters \spad{pts}, \spad{lns}, \spad{box}, \spad{axes} or
+ ++ \spad{un} are set to be \spad{1}, but will not be shown if they
+ ++ are set to \spad{0}. The color of the axes and the color of the
+ ++ units are indicated by the palette colors \spad{axesC} and
+ ++ \spad{unC} respectively. To display the control panel when
+ ++ the viewport window is displayed, set \spad{cP} to \spad{1},
+ ++ otherwise set it to \spad{0}.
+ graphStates : $ -> V GS
+ ++ graphStates(v) returns and shows a listing of a record containing
+ ++ the current state of the characteristics of each of the ten graph
+ ++ records in the given two-dimensional viewport, v, which is of
+ ++ domain \spadtype{TwoDimensionalViewport}.
+ graphs : $ -> V GU
+ ++ graphs(v) returns a vector, or list, which is a union of all
+ ++ the graphs, of the domain \spadtype{GraphImage}, which are
+ ++ allocated for the two-dimensional viewport, v, of domain
+ ++ \spadtype{TwoDimensionalViewport}. Those graphs which have
+ ++ no data are labeled "undefined", otherwise their contents
+ ++ are shown.
+ title : ($,STR) -> Void
+ ++ title(v,s) changes the title which is shown in the two-dimensional
+ ++ viewport window, v of domain \spadtype{TwoDimensionalViewport}.
+ putGraph : ($,G,PI) -> Void
+ ++ putGraph(v,gi,n) sets the graph field indicated by n, of the
+ ++ indicated two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, to be the graph, \spad{gi}
+ ++ of domain \spadtype{GraphImage}. The contents of viewport, v,
+ ++ will contain \spad{gi} when the function \spadfun{makeViewport2D}
+ ++ is called to create the an updated viewport v.
+ getGraph : ($,PI) -> G
+ ++ getGraph(v,n) returns the graph which is of the domain
+ ++ \spadtype{GraphImage} which is located in graph field n
+ ++ of the given two-dimensional viewport, v, which is of the
+ ++ domain \spadtype{TwoDimensionalViewport}.
+ axes : ($,PI,STR) -> Void
+ ++ axes(v,n,s) displays the axes of the graph in field n of
+ ++ the given two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, if s is "on", or does
+ ++ not display the axes if s is "off".
+ axes : ($,PI,PAL) -> Void
+ ++ axes(v,n,c) displays the axes of the graph in field n of
+ ++ the given two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, with the axes color set to
+ ++ the given palette color c.
+ units : ($,PI,STR) -> Void
+ ++ units(v,n,s) displays the units of the graph in field n of
+ ++ the given two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, if s is "on", or does
+ ++ not display the units if s is "off".
+ units : ($,PI,PAL) -> Void
+ ++ units(v,n,c) displays the units of the graph in field n of
+ ++ the given two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, with the units color set to
+ ++ the given palette color c.
+ points : ($,PI,STR) -> Void
+ ++ points(v,n,s) displays the points of the graph in field n of
+ ++ the given two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, if s is "on", or does
+ ++ not display the points if s is "off".
+ region : ($,PI,STR) -> Void
+ ++ region(v,n,s) displays the bounding box of the graph in
+ ++ field n of the given two-dimensional viewport, v, which is
+ ++ of domain \spadtype{TwoDimensionalViewport}, if s is "on",
+ ++ or does not display the bounding box if s is "off".
+ connect : ($,PI,STR) -> Void
+ ++ connect(v,n,s) displays the lines connecting the graph
+ ++ points in field n of the given two-dimensional viewport, v,
+ ++ which is of domain \spadtype{TwoDimensionalViewport}, if s
+ ++ is "on", or does not display the lines if s is "off".
+ controlPanel : ($,STR) -> Void
+ ++ controlPanel(v,s) displays the control panel of the given
+ ++ two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, if s is "on", or hides
+ ++ the control panel if s is "off".
+ close : $ -> Void
+ ++ close(v) closes the viewport window of the given
+ ++ two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, and terminates the
+ ++ corresponding process ID.
+ dimensions : ($,NNI,NNI,PI,PI) -> Void
+ ++ dimensions(v,x,y,width,height) sets the position of the
+ ++ upper left-hand corner of the two-dimensional viewport, v,
+ ++ which is of domain \spadtype{TwoDimensionalViewport}, to
+ ++ the window coordinate x, y, and sets the dimensions of the
+ ++ window to that of \spad{width}, \spad{height}. The new
+ ++ dimensions are not displayed until the function
+ ++ \spadfun{makeViewport2D} is executed again for v.
+ scale : ($,PI,F,F) -> Void
+ ++ scale(v,n,sx,sy) displays the graph in field n of the given
+ ++ two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, scaled by the factor \spad{sx}
+ ++ in the x-coordinate direction and by the factor \spad{sy} in
+ ++ the y-coordinate direction.
+ translate : ($,PI,F,F) -> Void
+ ++ translate(v,n,dx,dy) displays the graph in field n of the given
+ ++ two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, translated by \spad{dx} in
+ ++ the x-coordinate direction from the center of the viewport, and
+ ++ by \spad{dy} in the y-coordinate direction from the center.
+ ++ Setting \spad{dx} and \spad{dy} to \spad{0} places the center
+ ++ of the graph at the center of the viewport.
+ show : ($,PI,STR) -> Void
+ ++ show(v,n,s) displays the graph in field n of the given
+ ++ two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, if s is "on", or does not
+ ++ display the graph if s is "off".
+ move : ($,NNI,NNI) -> Void
+ ++ move(v,x,y) displays the two-dimensional viewport, v, which
+ ++ is of domain \spadtype{TwoDimensionalViewport}, with the upper
+ ++ left-hand corner of the viewport window at the screen
+ ++ coordinate position x, y.
+ update :($,G,PI) -> Void
+ ++ update(v,gr,n) drops the graph \spad{gr} in slot \spad{n}
+ ++ of viewport \spad{v}. The graph gr must have been
+ ++ transmitted already and acquired an integer key.
+ resize : ($,PI,PI) -> Void
+ ++ resize(v,w,h) displays the two-dimensional viewport, v, which
+ ++ is of domain \spadtype{TwoDimensionalViewport}, with a width
+ ++ of w and a height of h, keeping the upper left-hand corner
+ ++ position unchanged.
+ write : ($,STR) -> STR
+ ++ write(v,s) takes the given two-dimensional viewport, v, which
+ ++ is of domain \spadtype{TwoDimensionalViewport}, and creates
+ ++ a directory indicated by s, which contains the graph data
+ ++ files for v.
+ write : ($,STR,STR) -> STR
+ ++ write(v,s,f) takes the given two-dimensional viewport, v, which
+ ++ is of domain \spadtype{TwoDimensionalViewport}, and creates
+ ++ a directory indicated by s, which contains the graph data
+ ++ files for v and an optional file type f.
+ write : ($,STR,L STR) -> STR
+ ++ write(v,s,lf) takes the given two-dimensional viewport, v, which
+ ++ is of domain \spadtype{TwoDimensionalViewport}, and creates
+ ++ a directory indicated by s, which contains the graph data
+ ++ files for v and the optional file types indicated by the list lf.
+ reset : $ -> Void
+ ++ reset(v) sets the current state of the graph characteristics
+ ++ of the given two-dimensional viewport, v, which is of domain
+ ++ \spadtype{TwoDimensionalViewport}, back to their initial settings.
+ key : $ -> I
+ ++ key(v) returns the process ID number of the given two-dimensional
+ ++ viewport, v, which is of domain \spadtype{TwoDimensionalViewport}.
+ coerce : $ -> E
+ ++ coerce(v) returns the given two-dimensional viewport, v, which
+ ++ is of domain \spadtype{TwoDimensionalViewport} as output of
+ ++ the domain \spadtype{OutputForm}.
+
+ Implementation ==> add
+
+ import GraphImage()
+ import Color()
+ import Palette()
+ import ViewDefaultsPackage()
+ import DrawOptionFunctions0
+ import POINT
+
+ Rep := Record (key:I, graphsField:V GU, graphStatesField:V GS, _
+ title:STR, moveTo:XYNN, size:XYP, flags:FLAG, optionsField:L DROP)
+
+ defaultGS : GS := [convert(0.9)@SF, convert(0.9)@SF, 0$SF, 0$SF, _
+ yes, yes, no, _
+ yes, axesColorDefault(), no, unitsColorDefault(), _
+ yes]
+
+
+ --% Local Functions
+ checkViewport (viewport:$):B ==
+ -- checks to see if this viewport still exists
+ -- by sending the key to the viewport manager and
+ -- waiting for its reply after it checks it against
+ -- the viewports in its list. a -1 means it doesn't
+ -- exist.
+ sendI(VIEW,viewport.key)$Lisp
+ i := getI(VIEW)$Lisp
+ (i < 0$I) =>
+ viewport.key := 0$I
+ error "This viewport has already been closed!"
+ true
+
+ doOptions(v:Rep):Void ==
+ v.title := title(v.optionsField,"AXIOM2D")
+ -- etc - 2D specific stuff...
+
+ --% Exported Functions
+
+ options viewport ==
+ viewport.optionsField
+
+ options(viewport,opts) ==
+ viewport.optionsField := opts
+ viewport
+
+ putGraph (viewport,aGraph,which) ==
+ if ((which > maxGRAPHS) or (which < 1)) then
+ error "Trying to put a graph with a negative index or too big an index"
+ viewport.graphsField.which := aGraph
+
+ getGraph (viewport,which) ==
+ if ((which > maxGRAPHS) or (which < 1)) then
+ error "Trying to get a graph with a negative index or too big an index"
+ viewport.graphsField.which case "undefined" =>
+ error "Graph is undefined!"
+ viewport.graphsField.which::GraphImage
+
+
+ graphStates viewport == viewport.graphStatesField
+ graphs viewport == viewport.graphsField
+ key viewport == viewport.key
+
+ dimensions(viewport,ViewX,ViewY,ViewWidth,ViewHeight) ==
+ viewport.moveTo := [ViewX,ViewY]
+ viewport.size := [ViewWidth,ViewHeight]
+
+ move(viewport,xLoc,yLoc) ==
+ viewport.moveTo := [xLoc,yLoc]
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,MOVE)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,xLoc)$Lisp
+ sendI(VIEW,yLoc)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ update(viewport,graph,slot) ==
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,putGraph2D)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,key graph)$Lisp
+ sendI(VIEW,slot)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ resize(viewport,xSize,ySize) ==
+ viewport.size := [xSize,ySize]
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,RESIZE)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,xSize)$Lisp
+ sendI(VIEW,ySize)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ translate(viewport,graphIndex,xTranslateF,yTranslateF) ==
+ xTranslate := convert(xTranslateF)@SF
+ yTranslate := convert(yTranslateF)@SF
+ if (graphIndex > maxGRAPHS) then
+ error "Referring to a graph with too big an index"
+ viewport.graphStatesField.graphIndex.deltaX := xTranslate
+ viewport.graphStatesField.graphIndex.deltaY := yTranslate
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,TRANSLATE2D)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,graphIndex)$Lisp
+ sendSF(VIEW,xTranslate)$Lisp
+ sendSF(VIEW,yTranslate)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ scale(viewport,graphIndex,xScaleF,yScaleF) ==
+ xScale := convert(xScaleF)@SF
+ yScale := convert(yScaleF)@SF
+ if (graphIndex > maxGRAPHS) then
+ error "Referring to a graph with too big an index"
+ viewport.graphStatesField.graphIndex.scaleX := xScale -- check union (undefined?)
+ viewport.graphStatesField.graphIndex.scaleY := yScale -- check union (undefined?)
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,SCALE2D)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,graphIndex)$Lisp
+ sendSF(VIEW,xScale)$Lisp
+ sendSF(VIEW,yScale)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ viewport2D ==
+ [0,new(maxGRAPHS,"undefined"), _
+ new(maxGRAPHS,copy defaultGS),"AXIOM2D", _
+ [viewPosDefault().1,viewPosDefault().2],[viewSizeDefault().1,viewSizeDefault().2], _
+ [noControl], [] ]
+
+ makeViewport2D(g:G,opts:L DROP) ==
+ viewport := viewport2D()
+ viewport.graphsField.1 := g
+ viewport.optionsField := opts
+ makeViewport2D viewport
+
+ makeViewport2D viewportDollar ==
+ viewport := viewportDollar::Rep
+ doOptions viewport --local function to extract and assign optional arguments for 2D viewports
+ sayBrightly([" AXIOM2D data being transmitted to the viewport manager..."::E]$List(E))$Lisp
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,makeVIEW2D)$Lisp
+ sendSTR(VIEW,viewport.title)$Lisp
+ sendI(VIEW,viewport.moveTo.X)$Lisp
+ sendI(VIEW,viewport.moveTo.Y)$Lisp
+ sendI(VIEW,viewport.size.X)$Lisp
+ sendI(VIEW,viewport.size.Y)$Lisp
+ sendI(VIEW,viewport.flags.showCP)$Lisp
+ for i in 1..maxGRAPHS repeat
+ g := (graphs viewport).i
+ if g case "undefined" then
+ sendI(VIEW,0$I)$Lisp
+ else
+ sendI(VIEW,key(g::G))$Lisp
+ gs := (graphStates viewport).i
+ sendSF(VIEW,gs.scaleX)$Lisp
+ sendSF(VIEW,gs.scaleY)$Lisp
+ sendSF(VIEW,gs.deltaX)$Lisp
+ sendSF(VIEW,gs.deltaY)$Lisp
+ sendI(VIEW,gs.points)$Lisp
+ sendI(VIEW,gs.connect)$Lisp
+ sendI(VIEW,gs.spline)$Lisp
+ sendI(VIEW,gs.axes)$Lisp
+ hueShade := hue hue gs.axesColor + shade gs.axesColor * numberOfHues()
+ sendI(VIEW,hueShade)$Lisp
+ sendI(VIEW,gs.units)$Lisp
+ hueShade := hue hue gs.unitsColor + shade gs.unitsColor * numberOfHues()
+ sendI(VIEW,hueShade)$Lisp
+ sendI(VIEW,gs.showing)$Lisp
+ viewport.key := getI(VIEW)$Lisp
+ viewport
+
+ graphState(viewport,num,sX,sY,dX,dY,Points,Lines,Spline, _
+ Axes,AxesColor,Units,UnitsColor,Showing) ==
+ viewport.graphStatesField.num := [sX,sY,dX,dY,Points,Lines,Spline, _
+ Axes,AxesColor,Units,UnitsColor,Showing]
+
+ title(viewport,Title) ==
+ viewport.title := Title
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,TITLE)$Lisp
+ checkViewport viewport =>
+ sendSTR(VIEW,Title)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ reset viewport ==
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,SPADBUTTONPRESS)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,reset2D)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ axes (viewport:$,graphIndex:PI,onOff:STR) : Void ==
+ if (graphIndex > maxGRAPHS) then
+ error "Referring to a graph with too big an index"
+ if onOff = "on" then
+ status := yes
+ else
+ status := no
+ viewport.graphStatesField.graphIndex.axes := status -- check union (undefined?)
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,axesOnOff2D)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,graphIndex)$Lisp
+ sendI(VIEW,status)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ axes (viewport:$,graphIndex:PI,color:PAL) : Void ==
+ if (graphIndex > maxGRAPHS) then
+ error "Referring to a graph with too big an index"
+ viewport.graphStatesField.graphIndex.axesColor := color
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,axesColor2D)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,graphIndex)$Lisp
+ hueShade := hue hue color + shade color * numberOfHues()
+ sendI(VIEW,hueShade)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ units (viewport:$,graphIndex:PI,onOff:STR) : Void ==
+ if (graphIndex > maxGRAPHS) then
+ error "Referring to a graph with too big an index"
+ if onOff = "on" then
+ status := yes
+ else
+ status := no
+ viewport.graphStatesField.graphIndex.units := status -- check union (undefined?)
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,unitsOnOff2D)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,graphIndex)$Lisp
+ sendI(VIEW,status)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ units (viewport:$,graphIndex:PI,color:PAL) : Void ==
+ if (graphIndex > maxGRAPHS) then
+ error "Referring to a graph with too big an index"
+ viewport.graphStatesField.graphIndex.unitsColor := color
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,unitsColor2D)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,graphIndex)$Lisp
+ hueShade := hue hue color + shade color * numberOfHues()
+ sendI(VIEW,hueShade)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ connect (viewport:$,graphIndex:PI,onOff:STR) : Void ==
+ if (graphIndex > maxGRAPHS) then
+ error "Referring to a graph with too big an index"
+ if onOff = "on" then
+ status := 1$I
+ else
+ status := 0$I
+ viewport.graphStatesField.graphIndex.connect := status -- check union (undefined?)
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,connectOnOff)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,graphIndex)$Lisp
+ sendI(VIEW,status)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ points (viewport:$,graphIndex:PI,onOff:STR) : Void ==
+ if (graphIndex > maxGRAPHS) then
+ error "Referring to a graph with too big an index"
+ if onOff = "on" then
+ status := 1$I
+ else
+ status := 0$I
+ viewport.graphStatesField.graphIndex.points := status -- check union (undefined?)
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,pointsOnOff)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,graphIndex)$Lisp
+ sendI(VIEW,status)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ region (viewport:$,graphIndex:PI,onOff:STR) : Void ==
+ if (graphIndex > maxGRAPHS) then
+ error "Referring to a graph with too big an index"
+ if onOff = "on" then
+ status := 1$I
+ else
+ status := 0$I
+ viewport.graphStatesField.graphIndex.spline := status -- check union (undefined?)
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,spline2D)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,graphIndex)$Lisp
+ sendI(VIEW,status)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ show (viewport,graphIndex,onOff) ==
+ if (graphIndex > maxGRAPHS) then
+ error "Referring to a graph with too big an index"
+ if onOff = "on" then
+ status := 1$I
+ else
+ status := 0$I
+ viewport.graphStatesField.graphIndex.showing := status -- check union (undefined?)
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,showing2D)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,graphIndex)$Lisp
+ sendI(VIEW,status)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ controlPanel (viewport,onOff) ==
+ if onOff = "on" then viewport.flags.showCP := yes
+ else viewport.flags.showCP := no
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,hideControl2D)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,viewport.flags.showCP)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ close viewport ==
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,closeAll2D)$Lisp
+ checkViewport viewport =>
+ getI(VIEW)$Lisp -- acknowledge
+ viewport.key := 0$I
+
+ coerce viewport ==
+ (key(viewport) = 0$I) =>
+ hconcat ["Closed or Undefined TwoDimensionalViewport: "::E,
+ (viewport.title)::E]
+ hconcat ["TwoDimensionalViewport: "::E, (viewport.title)::E]
+
+ write(viewport:$,Filename:STR,aThingToWrite:STR) ==
+ write(viewport,Filename,[aThingToWrite])
+
+ write(viewport,Filename) ==
+ write(viewport,Filename,viewWriteDefault())
+
+ write(viewport:$,Filename:STR,thingsToWrite:L STR) ==
+ stringToSend : STR := ""
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW2D)$Lisp
+ sendI(VIEW,writeView)$Lisp
+ checkViewport viewport =>
+ sendSTR(VIEW,Filename)$Lisp
+ m := minIndex(avail := viewWriteAvailable())
+ for aTypeOfFile in thingsToWrite repeat
+ if (writeTypeInt:= position(upperCase aTypeOfFile,avail)-m) < 0 then
+ sayBrightly([" > "::E,(concat(aTypeOfFile, _
+ " is not a valid file type for writing a 2D viewport"))::E]$List(E))$Lisp
+ else
+ sendI(VIEW,writeTypeInt+(1$I))$Lisp
+ -- stringToSend := concat [stringToSend,"%",aTypeOfFile]
+ -- sendSTR(VIEW,stringToSend)$Lisp
+ sendI(VIEW,0$I)$Lisp -- no more types of things to write
+ getI(VIEW)$Lisp -- acknowledge
+ Filename
+
+@
+\subsection{TEST VIEW2D}
+<<TEST VIEW2D>>=
+<<multigraph.input>>
+@
+\section{License}
+<<license>>=
+--Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd.
+--All rights reserved.
+--
+--Redistribution and use in source and binary forms, with or without
+--modification, are permitted provided that the following conditions are
+--met:
+--
+-- - Redistributions of source code must retain the above copyright
+-- notice, this list of conditions and the following disclaimer.
+--
+-- - Redistributions in binary form must reproduce the above copyright
+-- notice, this list of conditions and the following disclaimer in
+-- the documentation and/or other materials provided with the
+-- distribution.
+--
+-- - Neither the name of The Numerical ALgorithms Group Ltd. nor the
+-- names of its contributors may be used to endorse or promote products
+-- derived from this software without specific prior written permission.
+--
+--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+--IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+--TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+--PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+--OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+--EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+--PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+--PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+--LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+--NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+--SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+@
+<<*>>=
+<<license>>
+
+<<domain GRIMAGE GraphImage>>
+<<domain VIEW2D TwoDimensionalViewport>>
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}