aboutsummaryrefslogtreecommitdiff
path: root/src/algebra/view3D.spad.pamphlet
diff options
context:
space:
mode:
authordos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
committerdos-reis <gdr@axiomatics.org>2007-08-14 05:14:52 +0000
commitab8cc85adde879fb963c94d15675783f2cf4b183 (patch)
treec202482327f474583b750b2c45dedfc4e4312b1d /src/algebra/view3D.spad.pamphlet
downloadopen-axiom-ab8cc85adde879fb963c94d15675783f2cf4b183.tar.gz
Initial population.
Diffstat (limited to 'src/algebra/view3D.spad.pamphlet')
-rw-r--r--src/algebra/view3D.spad.pamphlet1006
1 files changed, 1006 insertions, 0 deletions
diff --git a/src/algebra/view3D.spad.pamphlet b/src/algebra/view3D.spad.pamphlet
new file mode 100644
index 00000000..2bcb53a7
--- /dev/null
+++ b/src/algebra/view3D.spad.pamphlet
@@ -0,0 +1,1006 @@
+\documentclass{article}
+\usepackage{axiom}
+\begin{document}
+\title{\$SPAD/src/algebra view3D.spad}
+\author{James Wen}
+\maketitle
+\begin{abstract}
+\end{abstract}
+\eject
+\tableofcontents
+\eject
+\section{domain VIEW3D ThreeDimensionalViewport}
+<<domain VIEW3D ThreeDimensionalViewport>>=
+)abbrev domain VIEW3D ThreeDimensionalViewport
+++ Author: Jim Wen
+++ Date Created: 28 April 1989
+++ Date Last Updated: 2 November 1991, Jim Wen
+++ Basic Operations:
+++ Related Constructors:
+++ Also See:
+++ AMS Classifications:
+++ Keywords:
+++ References:
+++ Description: ThreeDimensionalViewport creates viewports to display graphs
+VIEW ==> VIEWPORTSERVER$Lisp
+sendI ==> SOCK_-SEND_-INT
+sendSF ==> SOCK_-SEND_-FLOAT
+sendSTR ==> SOCK_-SEND_-STRING
+getI ==> SOCK_-GET_-INT
+getSF ==> SOCK_-GET_-FLOAT
+
+typeVIEW3D ==> 1$I
+typeVIEWTube ==> 4
+
+makeVIEW3D ==> (-1)$SingleInteger
+
+ThreeDimensionalViewport(): Exports == Implementation where
+ I ==> Integer
+ PI ==> PositiveInteger
+ NNI ==> NonNegativeInteger
+ XY ==> Record( X:I, Y:I )
+ XYP ==> Record( X:PI, Y:PI )
+ XYNN ==> Record( X:NNI, Y:NNI )
+ SF ==> DoubleFloat
+ F ==> Float
+ L ==> List
+ Pt ==> ColoredThreeDimensionalPoint
+ SEG ==> Segment
+ S ==> String
+ E ==> OutputForm
+ PLOT3D ==> Plot3D
+ TUBE ==> TubePlot
+ V ==> Record( theta:SF, phi:SF, scale:SF, scaleX:SF, scaleY:SF, scaleZ:SF, deltaX:SF, deltaY:SF )
+ H ==> Record( hueOffset:I, hueNumber:I)
+ FLAG ==> Record( showCP:I, style:I, axesOn:I, diagonalsOn:I, outlineRenderOn:I, showRegionField:I )
+ FR ==> Record( fn:Fn2, fc: FnU, xmin:SF, xmax:SF, ymin:SF, ymax:SF, xnum:I, ynum:I )
+ FParamR ==> Record( theTube:TUBE )
+ LR ==> Record( lightX:SF, lightY:SF, lightZ:SF, lightTheta:SF, lightPhi:SF , translucence:SF)
+ UFR ==> Union(FR,FParamR,"undefined")
+ PR ==> Record( perspectiveField:I, eyeDistance:SF, hitherPlane:SF)
+ VR ==> Record( clipXMin:SF, clipXMax:SF, clipYMin:SF, clipYMax:SF, clipZMin:SF, clipZMax:SF, clipRegionField:I, clipSurfaceField:I)
+ C ==> Color()
+ B ==> Boolean
+ POINT ==> Point(SF)
+ SUBSPACE ==> SubSpace(3,SF)
+ SPACE3 ==> ThreeSpace(SF)
+ DROP ==> DrawOption
+ COORDSYS ==> CoordinateSystems(SF)
+
+ -- the below macros correspond to the ones in include/actions.h
+ ROTATE ==> 0$I -- rotate in actions.h
+ ZOOM ==> 1$I -- zoom in actions.h
+ TRANSLATE ==> 2 -- translate in actions.h
+ rendered ==> 3 -- render in actions.h
+ hideControl ==> 4
+ closeAll ==> 5
+ axesOnOff ==> 6
+ opaque ==> 7 -- opaqueMesh in action.h
+ contour ==> 24
+ RESET ==> 8
+ wireMesh ==> 9 -- transparent in actions.h
+ region3D ==> 12
+ smooth ==> 22
+ diagOnOff ==> 26
+ outlineOnOff ==> 13
+ zoomx ==> 14
+ zoomy ==> 15
+ zoomz ==> 16
+ perspectiveOnOff ==> 27
+ clipRegionOnOff ==> 66
+ clipSurfaceOnOff ==> 67
+
+ SPADBUTTONPRESS ==> 100
+ COLORDEF ==> 101
+ MOVE ==> 102
+ RESIZE ==> 103
+ TITLE ==> 104
+ lightDef ==> 108
+ translucenceDef ==> 109
+ writeView ==> 110
+ eyeDistanceData ==> 111
+ modifyPOINT ==> 114
+-- printViewport ==> 115
+ hitherPlaneData ==> 116
+ queryVIEWPOINT ==> 117
+ changeVIEWPOINT ==> 118
+
+ noControl ==> 0$I
+
+ yes ==> 1$I
+ no ==> 0$I
+
+ EYED ==> 500::SF -- see draw.h, should be the same(?) as clipOffset
+ HITHER ==> (-250)::SF -- see process.h in view3D/ (not yet passed to viewman)
+
+ openTube ==> 1$I
+ closedTube ==> 0$I
+
+ fun2Var3D ==> " Three Dimensional Viewport: Function of Two Variables"
+ para1Var3D ==> " Three Dimensional Viewport: Parametric Curve of One Variable"
+ undef3D ==> " Three Dimensional Viewport: No function defined for this viewport yet"
+
+ Exports ==> SetCategory with
+ viewThetaDefault : () -> F
+ ++ viewThetaDefault() returns the current default longitudinal
+ ++ view angle in radians.
+ viewThetaDefault : F -> F
+ ++ viewThetaDefault(t) sets the current default longitudinal
+ ++ view angle in radians to the value t and returns t.
+ viewPhiDefault : () -> F
+ ++ viewPhiDefault() returns the current default latitudinal
+ ++ view angle in radians.
+ viewPhiDefault : F -> F
+ ++ viewPhiDefault(p) sets the current default latitudinal
+ ++ view angle in radians to the value p and returns p.
+ viewZoomDefault : () -> F
+ ++ viewZoomDefault() returns the current default graph scaling
+ ++ value.
+ viewZoomDefault : F -> F
+ ++ viewZoomDefault(s) sets the current default graph scaling
+ ++ value to s and returns s.
+ viewDeltaXDefault : () -> F
+ ++ viewDeltaXDefault() returns the current default horizontal
+ ++ offset from the center of the viewport window.
+ viewDeltaXDefault : F -> F
+ ++ viewDeltaXDefault(dx) sets the current default horizontal
+ ++ offset from the center of the viewport window to be \spad{dx}
+ ++ and returns \spad{dx}.
+ viewDeltaYDefault : () -> F
+ ++ viewDeltaYDefault() returns the current default vertical
+ ++ offset from the center of the viewport window.
+ viewDeltaYDefault : F -> F
+ ++ viewDeltaYDefault(dy) sets the current default vertical
+ ++ offset from the center of the viewport window to be \spad{dy}
+ ++ and returns \spad{dy}.
+ viewport3D : () -> %
+ ++ viewport3D() returns an undefined three-dimensional viewport
+ ++ of the domain \spadtype{ThreeDimensionalViewport} whose
+ ++ contents are empty.
+ makeViewport3D : % -> %
+ ++ makeViewport3D(v) takes the given three-dimensional viewport,
+ ++ v, of the domain \spadtype{ThreeDimensionalViewport} and
+ ++ displays a viewport window on the screen which contains
+ ++ the contents of v.
+ makeViewport3D : (SPACE3,S) -> %
+ ++ makeViewport3D(sp,s) takes the given space, \spad{sp} which is
+ ++ of the domain \spadtype{ThreeSpace} and displays a viewport
+ ++ window on the screen which contains the contents of \spad{sp},
+ ++ and whose title is given by s.
+ makeViewport3D : (SPACE3,L DROP) -> %
+ ++ makeViewport3D(sp,lopt) takes the given space, \spad{sp} which is
+ ++ of the domain \spadtype{ThreeSpace} and displays a viewport
+ ++ window on the screen which contains the contents of \spad{sp},
+ ++ and whose draw options are indicated by the list \spad{lopt}, which
+ ++ is a list of options from the domain \spad{DrawOption}.
+ subspace : % -> SPACE3
+ ++ subspace(v) returns the contents of the viewport v, which is
+ ++ of the domain \spadtype{ThreeDimensionalViewport}, as a subspace
+ ++ of the domain \spad{ThreeSpace}.
+ subspace : (%,SPACE3) -> %
+ ++ subspace(v,sp) places the contents of the viewport v, which is
+ ++ of the domain \spadtype{ThreeDimensionalViewport}, in the subspace
+ ++ \spad{sp}, which is of the domain \spad{ThreeSpace}.
+ modifyPointData : (%,NNI,POINT) -> Void
+ ++ modifyPointData(v,ind,pt) takes the viewport, v, which is of the
+ ++ domain \spadtype{ThreeDimensionalViewport}, and places the data
+ ++ point, \spad{pt} into the list of points database of v at the index
+ ++ location given by \spad{ind}.
+ options : % -> L DROP
+ ++ options(v) takes the viewport, v, which is of the domain
+ ++ \spadtype{ThreeDimensionalViewport} and returns a list of all
+ ++ the draw options from the domain \spad{DrawOption} which are
+ ++ being used by v.
+ options : (%,L DROP) -> %
+ ++ options(v,lopt) takes the viewport, v, which is of the domain
+ ++ \spadtype{ThreeDimensionalViewport} and sets the draw options
+ ++ being used by v to those indicated in the list, \spad{lopt},
+ ++ which is a list of options from the domain \spad{DrawOption}.
+ move : (%,NNI,NNI) -> Void
+ ++ move(v,x,y) displays the three-dimensional viewport, v, which
+ ++ is of domain \spadtype{ThreeDimensionalViewport}, with the upper
+ ++ left-hand corner of the viewport window at the screen
+ ++ coordinate position x, y.
+ resize : (%,PI,PI) -> Void
+ ++ resize(v,w,h) displays the three-dimensional viewport, v, which
+ ++ is of domain \spadtype{ThreeDimensionalViewport}, with a width
+ ++ of w and a height of h, keeping the upper left-hand corner
+ ++ position unchanged.
+ title : (%,S) -> Void
+ ++ title(v,s) changes the title which is shown in the three-dimensional
+ ++ viewport window, v of domain \spadtype{ThreeDimensionalViewport}.
+ dimensions : (%,NNI,NNI,PI,PI) -> Void
+ ++ dimensions(v,x,y,width,height) sets the position of the
+ ++ upper left-hand corner of the three-dimensional viewport, v,
+ ++ which is of domain \spadtype{ThreeDimensionalViewport}, 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{makeViewport3D} is executed again for v.
+ viewpoint : (%,F,F,F,F,F) -> Void
+ ++ viewpoint(v,th,phi,s,dx,dy) sets the longitudinal view angle
+ ++ to \spad{th} radians, the latitudinal view angle to \spad{phi}
+ ++ radians, the scale factor to \spad{s}, the horizontal viewport
+ ++ offset to \spad{dx}, and the vertical viewport offset to \spad{dy}
+ ++ for the viewport v, which is of the domain
+ ++ \spadtype{ThreeDimensionalViewport}. The new viewpoint position
+ ++ is not displayed until the function \spadfun{makeViewport3D} is
+ ++ executed again for v.
+ viewpoint : (%) -> V
+ ++ viewpoint(v) returns the current viewpoint setting of the given
+ ++ viewport, v. This function is useful in the situation where the
+ ++ user has created a viewport, proceeded to interact with it via
+ ++ the control panel and desires to save the values of the viewpoint
+ ++ as the default settings for another viewport to be created using
+ ++ the system.
+ viewpoint : (%,V) -> Void
+ ++ viewpoint(v,viewpt) sets the viewpoint for the viewport. The
+ ++ viewport record consists of the latitudal and longitudal angles,
+ ++ the zoom factor, the X, Y, and Z scales, and the X and Y displacements.
+ viewpoint : (%,I,I,F,F,F) -> Void
+ ++ viewpoint(v,th,phi,s,dx,dy) sets the longitudinal view angle
+ ++ to \spad{th} degrees, the latitudinal view angle to \spad{phi}
+ ++ degrees, the scale factor to \spad{s}, the horizontal viewport
+ ++ offset to \spad{dx}, and the vertical viewport offset to \spad{dy}
+ ++ for the viewport v, which is of the domain
+ ++ \spadtype{ThreeDimensionalViewport}. The new viewpoint position
+ ++ is not displayed until the function \spadfun{makeViewport3D} is
+ ++ executed again for v.
+ viewpoint : (%,F,F) -> Void
+ ++ viewpoint(v,th,phi) sets the longitudinal view angle to \spad{th}
+ ++ radians and the latitudinal view angle to \spad{phi} radians
+ ++ for the viewport v, which is of the domain
+ ++ \spadtype{ThreeDimensionalViewport}. The new viewpoint position
+ ++ is not displayed until the function \spadfun{makeViewport3D} is
+ ++ executed again for v.
+ viewpoint : (%,F,F,F) -> Void
+ ++ viewpoint(v,rotx,roty,rotz) sets the rotation about the x-axis
+ ++ to be \spad{rotx} radians, sets the rotation about the y-axis
+ ++ to be \spad{roty} radians, and sets the rotation about the z-axis
+ ++ to be \spad{rotz} radians, for the viewport v, which is of the
+ ++ domain \spadtype{ThreeDimensionalViewport} and displays v with
+ ++ the new view position.
+ controlPanel : (%,S) -> Void
+ ++ controlPanel(v,s) displays the control panel of the given
+ ++ three-dimensional viewport, v, which is of domain
+ ++ \spadtype{ThreeDimensionalViewport}, if s is "on", or hides
+ ++ the control panel if s is "off".
+ axes : (%,S) -> Void
+ ++ axes(v,s) displays the axes of the given three-dimensional
+ ++ viewport, v, which is of domain \spadtype{ThreeDimensionalViewport},
+ ++ if s is "on", or does not display the axes if s is "off".
+ diagonals : (%,S) -> Void
+ ++ diagonals(v,s) displays the diagonals of the polygon outline
+ ++ showing a triangularized surface instead of a quadrilateral
+ ++ surface outline, for the given three-dimensional viewport v
+ ++ which is of domain \spadtype{ThreeDimensionalViewport}, if s is
+ ++ "on", or does not display the diagonals if s is "off".
+ outlineRender : (%,S) -> Void
+ ++ outlineRender(v,s) displays the polygon outline showing either
+ ++ triangularized surface or a quadrilateral surface outline depending
+ ++ on the whether the \spadfun{diagonals} function has been set, for
+ ++ the given three-dimensional viewport v which is of domain
+ ++ \spadtype{ThreeDimensionalViewport}, if s is "on", or does not
+ ++ display the polygon outline if s is "off".
+ drawStyle : (%,S) -> Void
+ ++ drawStyle(v,s) displays the surface for the given three-dimensional
+ ++ viewport v which is of domain \spadtype{ThreeDimensionalViewport}
+ ++ in the style of drawing indicated by s. If s is not a valid
+ ++ drawing style the style is wireframe by default. Possible
+ ++ styles are \spad{"shade"}, \spad{"solid"} or \spad{"opaque"},
+ ++ \spad{"smooth"}, and \spad{"wireMesh"}.
+ rotate : (%,F,F) -> Void
+ ++ rotate(v,th,phi) rotates the graph to the longitudinal view angle
+ ++ \spad{th} radians and the latitudinal view angle \spad{phi} radians
+ ++ for the viewport v, which is of the domain
+ ++ \spadtype{ThreeDimensionalViewport}.
+ rotate : (%,I,I) -> Void
+ ++ rotate(v,th,phi) rotates the graph to the longitudinal view angle
+ ++ \spad{th} degrees and the latitudinal view angle \spad{phi} degrees
+ ++ for the viewport v, which is of the domain
+ ++ \spadtype{ThreeDimensionalViewport}. The new rotation position
+ ++ is not displayed until the function \spadfun{makeViewport3D} is
+ ++ executed again for v.
+ zoom : (%,F) -> Void
+ ++ zoom(v,s) sets the graph scaling factor to s, for the viewport v,
+ ++ which is of the domain \spadtype{ThreeDimensionalViewport}.
+ zoom : (%,F,F,F) -> Void
+ ++ zoom(v,sx,sy,sz) sets the graph scaling factors for the x-coordinate
+ ++ axis to \spad{sx}, the y-coordinate axis to \spad{sy} and the
+ ++ z-coordinate axis to \spad{sz} for the viewport v, which is of
+ ++ the domain \spadtype{ThreeDimensionalViewport}.
+ translate : (%,F,F) -> Void
+ ++ translate(v,dx,dy) sets the horizontal viewport offset to \spad{dx}
+ ++ and the vertical viewport offset to \spad{dy}, for the viewport v,
+ ++ which is of the domain \spadtype{ThreeDimensionalViewport}.
+ perspective : (%,S) -> Void
+ ++ perspective(v,s) displays the graph in perspective if s is "on",
+ ++ or does not display perspective if s is "off" for the given
+ ++ three-dimensional viewport, v, which is of domain
+ ++ \spadtype{ThreeDimensionalViewport}.
+ eyeDistance : (%,F) -> Void
+ ++ eyeDistance(v,d) sets the distance of the observer from the center
+ ++ of the graph to d, for the viewport v, which is of the domain
+ ++ \spadtype{ThreeDimensionalViewport}.
+ hitherPlane : (%,F) -> Void
+ ++ hitherPlane(v,h) sets the hither clipping plane of the graph to h,
+ ++ for the viewport v, which is of the domain
+ ++ \spadtype{ThreeDimensionalViewport}.
+ showRegion : (%,S) -> Void
+ ++ showRegion(v,s) displays the bounding box of the given
+ ++ three-dimensional viewport, v, which is of domain
+ ++ \spadtype{ThreeDimensionalViewport}, if s is "on", or does not
+ ++ display the box if s is "off".
+ showClipRegion : (%,S) -> Void
+ ++ showClipRegion(v,s) displays the clipping region of the given
+ ++ three-dimensional viewport, v, which is of domain
+ ++ \spadtype{ThreeDimensionalViewport}, if s is "on", or does not
+ ++ display the region if s is "off".
+ clipSurface : (%,S) -> Void
+ ++ clipSurface(v,s) displays the graph with the specified
+ ++ clipping region removed if s is "on", or displays the graph
+ ++ without clipping implemented if s is "off", for the given
+ ++ three-dimensional viewport, v, which is of domain
+ ++ \spadtype{ThreeDimensionalViewport}.
+ lighting : (%,F,F,F) -> Void
+ ++ lighting(v,x,y,z) sets the position of the light source to
+ ++ the coordinates x, y, and z and displays the graph for the given
+ ++ three-dimensional viewport, v, which is of domain
+ ++ \spadtype{ThreeDimensionalViewport}.
+ intensity : (%,F) -> Void
+ ++ intensity(v,i) sets the intensity of the light source to i, for
+ ++ the given three-dimensional viewport, v, which is of domain
+ ++ \spadtype{ThreeDimensionalViewport}.
+ reset : % -> Void
+ ++ reset(v) sets the current state of the graph characteristics
+ ++ of the given three-dimensional viewport, v, which is of domain
+ ++ \spadtype{ThreeDimensionalViewport}, back to their initial settings.
+ colorDef : (%,C,C) -> Void
+ ++ colorDef(v,c1,c2) sets the range of colors along the colormap so
+ ++ that the lower end of the colormap is defined by \spad{c1} and the
+ ++ top end of the colormap is defined by \spad{c2}, for the given
+ ++ three-dimensional viewport, v, which is of domain
+ ++ \spadtype{ThreeDimensionalViewport}.
+ write : (%,S) -> S
+ ++ write(v,s) takes the given three-dimensional viewport, v, which
+ ++ is of domain \spadtype{ThreeDimensionalViewport}, and creates
+ ++ a directory indicated by s, which contains the graph data
+ ++ file for v.
+ write : (%,S,S) -> S
+ ++ write(v,s,f) takes the given three-dimensional viewport, v, which
+ ++ is of domain \spadtype{ThreeDimensionalViewport}, and creates
+ ++ a directory indicated by s, which contains the graph data
+ ++ file for v and an optional file type f.
+ write : (%,S,L S) -> S
+ ++ write(v,s,lf) takes the given three-dimensional viewport, v, which
+ ++ is of domain \spadtype{ThreeDimensionalViewport}, and creates
+ ++ a directory indicated by s, which contains the graph data
+ ++ file for v and the optional file types indicated by the list lf.
+ close : % -> Void
+ ++ close(v) closes the viewport window of the given
+ ++ three-dimensional viewport, v, which is of domain
+ ++ \spadtype{ThreeDimensionalViewport}, and terminates the
+ ++ corresponding process ID.
+ key : % -> I
+ ++ key(v) returns the process ID number of the given three-dimensional
+ ++ viewport, v, which is of domain \spadtype{ThreeDimensionalViewport}.
+-- print : % -> Void
+
+ Implementation ==> add
+ import Color()
+ import ViewDefaultsPackage()
+ import Plot3D()
+ import TubePlot()
+ import POINT
+ import PointPackage(SF)
+ import SubSpaceComponentProperty()
+ import SPACE3
+ import MeshCreationRoutinesForThreeDimensions()
+ import DrawOptionFunctions0
+ import COORDSYS
+ import Set(PositiveInteger)
+
+ Rep := Record (key:I, fun:I, _
+ title:S, moveTo:XYNN, size:XYP, viewpoint:V, colors:H, flags:FLAG, _
+ lighting:LR, perspective:PR, volume:VR, _
+ space3D:SPACE3, _
+ optionsField:L DROP)
+
+ degrees := pi()$F / 180.0
+ degreesSF := pi()$SF / 180
+ defaultTheta : Reference(SF) := ref(convert(pi()$F/4.0)@SF)
+ defaultPhi : Reference(SF) := ref(convert(-pi()$F/4.0)@SF)
+ defaultZoom : Reference(SF) := ref(convert(1.2)@SF)
+ defaultDeltaX : Reference(SF) := ref 0
+ defaultDeltaY : Reference(SF) := ref 0
+
+
+--%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
+
+ arcsinTemp(x:SF):SF ==
+ -- the asin function doesn't exist in the SF domain currently
+ x >= 1 => (pi()$SF / 2) -- to avoid floating point error from SF (ie 1.0 -> 1.00001)
+ x <= -1 => 3 * pi()$SF / 2
+ convert(asin(convert(x)@Float)$Float)@SF
+
+ arctanTemp(x:SF):SF == convert(atan(convert(x)@Float)$Float)@SF
+
+ doOptions(v:Rep):Void ==
+ v.title := title(v.optionsField,"AXIOM3D")
+ st:S := style(v.optionsField,"wireMesh")
+ if (st = "shade" or st = "render") then
+ v.flags.style := rendered
+ else if (st = "solid" or st = "opaque") then
+ v.flags.style := opaque
+ else if (st = "contour") then
+ v.flags.style := contour
+ else if (st = "smooth") then
+ v.flags.style := smooth
+ else v.flags.style := wireMesh
+ v.viewpoint := viewpoint(v.optionsField,
+ [deref defaultTheta,deref defaultPhi,deref defaultZoom, _
+ 1$SF,1$SF,1$SF,deref defaultDeltaX, deref defaultDeltaY])
+ -- etc - 3D specific stuff...
+
+--%Exported Functions : Default Settings
+ viewport3D() ==
+ [0,typeVIEW3D,"AXIOM3D",[viewPosDefault().1,viewPosDefault().2], _
+ [viewSizeDefault().1,viewSizeDefault().2], _
+ [deref defaultTheta,deref defaultPhi,deref defaultZoom, _
+ 1$SF,1$SF,1$SF,deref defaultDeltaX, deref defaultDeltaY], [0,27], _
+ [noControl,wireMesh,yes,no,no,no], [0$SF,0$SF,1$SF,0$SF,0$SF,1$SF], _
+ [yes, EYED, HITHER], [0$SF,1$SF,0$SF,1$SF,0$SF,1$SF,no,yes], _
+ create3Space()$SPACE3, [] ]
+
+ subspace viewport ==
+ viewport.space3D
+
+ subspace(viewport,space) ==
+ viewport.space3D := space
+ viewport
+
+ options viewport ==
+ viewport.optionsField
+
+ options(viewport,opts) ==
+ viewport.optionsField := opts
+ viewport
+
+ makeViewport3D(space:SPACE3,Title:S):% ==
+ v := viewport3D()
+ v.space3D := space
+ v.optionsField := [title(Title)]
+ makeViewport3D v
+
+ makeViewport3D(space:SPACE3,opts:L DROP):% ==
+ v := viewport3D()
+ v.space3D := space
+ v.optionsField := opts
+ makeViewport3D v
+
+ makeViewport3D viewport ==
+ doOptions viewport --local function to extract and assign optional arguments for 3D viewports
+ sayBrightly([" Transmitting data..."::E]$List(E))$Lisp
+ transform := coord(viewport.optionsField,cartesian$COORDSYS)$DrawOptionFunctions0
+ check(viewport.space3D)
+ lpts := lp(viewport.space3D)
+ lllipts := lllip(viewport.space3D)
+ llprops := llprop(viewport.space3D)
+ lprops := lprop(viewport.space3D)
+ -- check for dimensionality of points
+ -- if they are all 4D points, then everything is okay
+ -- if they are all 3D points, then pad an extra constant
+ -- coordinate for color
+ -- if they have varying dimensionalities, give an error
+ s := brace()$Set(PI)
+ for pt in lpts repeat
+ insert_!(dimension pt,s)
+ #s > 1 => error "All points should have the same dimension"
+ (n := first parts s) < 3 => error "Dimension of points should be greater than 2"
+ sendI(VIEW,viewport.fun)$Lisp
+ sendI(VIEW,makeVIEW3D)$Lisp
+ sendSTR(VIEW,viewport.title)$Lisp
+ sendSF(VIEW,viewport.viewpoint.deltaX)$Lisp
+ sendSF(VIEW,viewport.viewpoint.deltaY)$Lisp
+ sendSF(VIEW,viewport.viewpoint.scale)$Lisp
+ sendSF(VIEW,viewport.viewpoint.scaleX)$Lisp
+ sendSF(VIEW,viewport.viewpoint.scaleY)$Lisp
+ sendSF(VIEW,viewport.viewpoint.scaleZ)$Lisp
+ sendSF(VIEW,viewport.viewpoint.theta)$Lisp
+ sendSF(VIEW,viewport.viewpoint.phi)$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
+ sendI(VIEW,viewport.flags.style)$Lisp
+ sendI(VIEW,viewport.flags.axesOn)$Lisp
+ sendI(VIEW,viewport.flags.diagonalsOn)$Lisp
+ sendI(VIEW,viewport.flags.outlineRenderOn)$Lisp
+ sendI(VIEW,viewport.flags.showRegionField)$Lisp -- add to make3D.c
+ sendI(VIEW,viewport.volume.clipRegionField)$Lisp -- add to make3D.c
+ sendI(VIEW,viewport.volume.clipSurfaceField)$Lisp -- add to make3D.c
+ sendI(VIEW,viewport.colors.hueOffset)$Lisp
+ sendI(VIEW,viewport.colors.hueNumber)$Lisp
+ sendSF(VIEW,viewport.lighting.lightX)$Lisp
+ sendSF(VIEW,viewport.lighting.lightY)$Lisp
+ sendSF(VIEW,viewport.lighting.lightZ)$Lisp
+ sendSF(VIEW,viewport.lighting.translucence)$Lisp
+ sendI(VIEW,viewport.perspective.perspectiveField)$Lisp
+ sendSF(VIEW,viewport.perspective.eyeDistance)$Lisp
+ -- new, crazy points domain stuff
+ -- first, send the point data list
+ sendI(VIEW,#lpts)$Lisp
+ for pt in lpts repeat
+ aPoint := transform pt
+ sendSF(VIEW,xCoord aPoint)$Lisp
+ sendSF(VIEW,yCoord aPoint)$Lisp
+ sendSF(VIEW,zCoord aPoint)$Lisp
+ n = 3 => sendSF(VIEW,zCoord aPoint)$Lisp
+ sendSF(VIEW,color aPoint)$Lisp -- change to c
+ -- now, send the 3d subspace structure
+ sendI(VIEW,#lllipts)$Lisp
+ for allipts in lllipts for oneprop in lprops for onelprops in llprops repeat
+ -- the following is false for f(x,y) and user-defined for [x(t),y(t),z(t)]
+ -- this is temporary - until the generalized points stuff gets put in
+ sendI(VIEW,(closed? oneprop => yes; no))$Lisp
+ sendI(VIEW,(solid? oneprop => yes; no))$Lisp
+ sendI(VIEW,#allipts)$Lisp
+ for alipts in allipts for tinyprop in onelprops repeat
+ -- the following is false for f(x,y) and true for [x(t),y(t),z(t)]
+ -- this is temporary -- until the generalized points stuff gets put in
+ sendI(VIEW,(closed? tinyprop => yes;no))$Lisp
+ sendI(VIEW,(solid? tinyprop => yes;no))$Lisp
+ sendI(VIEW,#alipts)$Lisp
+ for oneIndexedPoint in alipts repeat
+ sendI(VIEW,oneIndexedPoint)$Lisp
+ viewport.key := getI(VIEW)$Lisp
+ viewport
+ -- the key (now set to 0) should be what the viewport returns
+
+ viewThetaDefault == convert(defaultTheta())@F
+ viewThetaDefault t ==
+ defaultTheta() := convert(t)@SF
+ t
+ viewPhiDefault == convert(defaultPhi())@F
+ viewPhiDefault t ==
+ defaultPhi() := convert(t)@SF
+ t
+ viewZoomDefault == convert(defaultZoom())@F
+ viewZoomDefault t ==
+ defaultZoom() := convert(t)@SF
+ t
+ viewDeltaXDefault == convert(defaultDeltaX())@F
+ viewDeltaXDefault t ==
+ defaultDeltaX() := convert(t)@SF
+ t
+ viewDeltaYDefault == convert(defaultDeltaY())@F
+ viewDeltaYDefault t ==
+ defaultDeltaY() := convert(t)@SF
+ t
+
+--Exported Functions: Available features for 3D viewports
+ lighting(viewport,Xlight,Ylight,Zlight) ==
+ viewport.lighting.lightX := convert(Xlight)@SF
+ viewport.lighting.lightY := convert(Ylight)@SF
+ viewport.lighting.lightZ := convert(Zlight)@SF
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,lightDef)$Lisp
+ checkViewport viewport =>
+ sendSF(VIEW,viewport.lighting.lightX)$Lisp
+ sendSF(VIEW,viewport.lighting.lightY)$Lisp
+ sendSF(VIEW,viewport.lighting.lightZ)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ axes (viewport,onOff) ==
+ if onOff = "on" then viewport.flags.axesOn := yes
+ else viewport.flags.axesOn := no
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,axesOnOff)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,viewport.flags.axesOn)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ diagonals (viewport,onOff) ==
+ if onOff = "on" then viewport.flags.diagonalsOn := yes
+ else viewport.flags.diagonalsOn := no
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,diagOnOff)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,viewport.flags.diagonalsOn)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ outlineRender (viewport,onOff) ==
+ if onOff = "on" then viewport.flags.outlineRenderOn := yes
+ else viewport.flags.outlineRenderOn := no
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,outlineOnOff)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,viewport.flags.outlineRenderOn)$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,typeVIEW3D)$Lisp
+ sendI(VIEW,hideControl)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,viewport.flags.showCP)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ drawStyle (viewport,how) ==
+ if (how = "shade") then -- render
+ viewport.flags.style := rendered
+ else if (how = "solid") then -- opaque
+ viewport.flags.style := opaque
+ else if (how = "contour") then -- contour
+ viewport.flags.style := contour
+ else if (how = "smooth") then -- smooth
+ viewport.flags.style := smooth
+ else viewport.flags.style := wireMesh
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,viewport.flags.style)$Lisp
+ checkViewport viewport =>
+ getI(VIEW)$Lisp -- acknowledge
+
+ reset viewport ==
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,SPADBUTTONPRESS)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,RESET)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ close viewport ==
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,closeAll)$Lisp
+ checkViewport viewport =>
+ getI(VIEW)$Lisp -- acknowledge
+ viewport.key := 0$I
+
+ viewpoint (viewport:%):V ==
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,queryVIEWPOINT)$Lisp
+ checkViewport viewport =>
+ deltaX_sf : SF := getSF(VIEW)$Lisp
+ deltaY_sf : SF := getSF(VIEW)$Lisp
+ scale_sf : SF := getSF(VIEW)$Lisp
+ scaleX_sf : SF := getSF(VIEW)$Lisp
+ scaleY_sf : SF := getSF(VIEW)$Lisp
+ scaleZ_sf : SF := getSF(VIEW)$Lisp
+ theta_sf : SF := getSF(VIEW)$Lisp
+ phi_sf : SF := getSF(VIEW)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+ viewport.viewpoint :=
+ [ theta_sf, phi_sf, scale_sf, scaleX_sf, scaleY_sf, scaleZ_sf,
+ deltaX_sf, deltaY_sf ]
+ viewport.viewpoint
+
+ viewpoint (viewport:%, viewpt:V):Void ==
+ viewport.viewpoint := viewpt
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,changeVIEWPOINT)$Lisp
+ checkViewport viewport =>
+ sendSF(VIEW,viewport.viewpoint.deltaX)$Lisp
+ sendSF(VIEW,viewport.viewpoint.deltaY)$Lisp
+ sendSF(VIEW,viewport.viewpoint.scale)$Lisp
+ sendSF(VIEW,viewport.viewpoint.scaleX)$Lisp
+ sendSF(VIEW,viewport.viewpoint.scaleY)$Lisp
+ sendSF(VIEW,viewport.viewpoint.scaleZ)$Lisp
+ sendSF(VIEW,viewport.viewpoint.theta)$Lisp
+ sendSF(VIEW,viewport.viewpoint.phi)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+
+ viewpoint (viewport:%,Theta:F,Phi:F,Scale:F,DeltaX:F,DeltaY:F):Void ==
+ viewport.viewpoint :=
+ [convert(Theta)@SF,convert(Phi)@SF,convert(Scale)@SF,1$SF,1$SF,1$SF,convert(DeltaX)@SF,convert(DeltaY)@SF]
+
+ viewpoint (viewport:%,Theta:I,Phi:I,Scale:F,DeltaX:F,DeltaY:F):Void ==
+ viewport.viewpoint := [convert(Theta)@SF * degreesSF,convert(Phi)@SF * degreesSF,
+ convert(Scale)@SF,1$SF,1$SF,1$SF,convert(DeltaX)@SF,convert(DeltaY)@SF]
+
+ viewpoint (viewport:%,Theta:F,Phi:F):Void ==
+ viewport.viewpoint.theta := convert(Theta)@SF * degreesSF
+ viewport.viewpoint.phi := convert(Phi)@SF * degreesSF
+
+ viewpoint (viewport:%,X:F,Y:F,Z:F):Void ==
+ Theta : F
+ Phi : F
+ if (X=0$F) and (Y=0$F) then
+ Theta := 0$F
+ if (Z>=0$F) then
+ Phi := 0$F
+ else
+ Phi := 180.0
+ else
+ Theta := asin(Y/(R := sqrt(X*X+Y*Y)))
+ if (Z=0$F) then
+ Phi := 90.0
+ else
+ Phi := atan(Z/R)
+ rotate(viewport, Theta * degrees, Phi * degrees)
+
+ title (viewport,Title) ==
+ viewport.title := Title
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,TITLE)$Lisp
+ checkViewport viewport =>
+ sendSTR(VIEW,Title)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ colorDef (viewport,HueOffset,HueNumber) ==
+ viewport.colors := [h := (hue HueOffset),(hue HueNumber) - h]
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,COLORDEF)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,hue HueOffset)$Lisp
+ sendI(VIEW,hue HueNumber)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ 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,typeVIEW3D)$Lisp
+ sendI(VIEW,MOVE)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,xLoc)$Lisp
+ sendI(VIEW,yLoc)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ resize(viewport,xSize,ySize) ==
+ viewport.size := [xSize,ySize]
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,RESIZE)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,xSize)$Lisp
+ sendI(VIEW,ySize)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ coerce viewport ==
+ (key(viewport) = 0$I) =>
+ hconcat
+ ["Closed or Undefined ThreeDimensionalViewport: "::E,
+ (viewport.title)::E]
+ hconcat ["ThreeDimensionalViewport: "::E, (viewport.title)::E]
+
+ key viewport == viewport.key
+
+ rotate(viewport:%,Theta:I,Phi:I) ==
+ rotate(viewport,Theta::F * degrees,Phi::F * degrees)
+
+ rotate(viewport:%,Theta:F,Phi:F) ==
+ viewport.viewpoint.theta := convert(Theta)@SF
+ viewport.viewpoint.phi := convert(Phi)@SF
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,ROTATE)$Lisp
+ checkViewport viewport =>
+ sendSF(VIEW,viewport.viewpoint.theta)$Lisp
+ sendSF(VIEW,viewport.viewpoint.phi)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ zoom(viewport:%,Scale:F) ==
+ viewport.viewpoint.scale := convert(Scale)@SF
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,ZOOM)$Lisp
+ checkViewport viewport =>
+ sendSF(VIEW,viewport.viewpoint.scale)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ zoom(viewport:%,ScaleX:F,ScaleY:F,ScaleZ:F) ==
+ viewport.viewpoint.scaleX := convert(ScaleX)@SF
+ viewport.viewpoint.scaleY := convert(ScaleY)@SF
+ viewport.viewpoint.scaleZ := convert(ScaleZ)@SF
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,zoomx)$Lisp
+ checkViewport viewport =>
+ sendSF(VIEW,viewport.viewpoint.scaleX)$Lisp
+ sendSF(VIEW,viewport.viewpoint.scaleY)$Lisp
+ sendSF(VIEW,viewport.viewpoint.scaleZ)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ translate(viewport,DeltaX,DeltaY) ==
+ viewport.viewpoint.deltaX := convert(DeltaX)@SF
+ viewport.viewpoint.deltaY := convert(DeltaY)@SF
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,TRANSLATE)$Lisp
+ checkViewport viewport =>
+ sendSF(VIEW,viewport.viewpoint.deltaX)$Lisp
+ sendSF(VIEW,viewport.viewpoint.deltaY)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ intensity(viewport,Amount) ==
+ if (Amount < 0$F) or (Amount > 1$F) then
+ error "The intensity must be a value between 0 and 1, inclusively."
+ viewport.lighting.translucence := convert(Amount)@SF
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,translucenceDef)$Lisp
+ checkViewport viewport =>
+ sendSF(VIEW,viewport.lighting.translucence)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ write(viewport:%,Filename:S,aThingToWrite:S) ==
+ write(viewport,Filename,[aThingToWrite])
+
+ write(viewport,Filename) ==
+ write(viewport,Filename,viewWriteDefault())
+
+ write(viewport:%,Filename:S,thingsToWrite:L S) ==
+ stringToSend : S := ""
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$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 3D viewport"))::E]$List(E))$Lisp
+ else
+ sendI(VIEW,writeTypeInt+(1$I))$Lisp
+ sendI(VIEW,0$I)$Lisp -- no more types of things to write
+ getI(VIEW)$Lisp -- acknowledge
+ Filename
+
+ perspective (viewport,onOff) ==
+ if onOff = "on" then viewport.perspective.perspectiveField := yes
+ else viewport.perspective.perspectiveField := no
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,perspectiveOnOff)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,viewport.perspective.perspectiveField)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ showRegion (viewport,onOff) ==
+ if onOff = "on" then viewport.flags.showRegionField := yes
+ else viewport.flags.showRegionField := no
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,region3D)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,viewport.flags.showRegionField)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ showClipRegion (viewport,onOff) ==
+ if onOff = "on" then viewport.volume.clipRegionField := yes
+ else viewport.volume.clipRegionField := no
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,clipRegionOnOff)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,viewport.volume.clipRegionField)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ clipSurface (viewport,onOff) ==
+ if onOff = "on" then viewport.volume.clipSurfaceField := yes
+ else viewport.volume.clipSurfaceField := no
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,clipSurfaceOnOff)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,viewport.volume.clipSurfaceField)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ eyeDistance(viewport:%,EyeDistance:F) ==
+ viewport.perspective.eyeDistance := convert(EyeDistance)@SF
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,eyeDistanceData)$Lisp
+ checkViewport viewport =>
+ sendSF(VIEW,viewport.perspective.eyeDistance)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ hitherPlane(viewport:%,HitherPlane:F) ==
+ viewport.perspective.hitherPlane := convert(HitherPlane)@SF
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,hitherPlaneData)$Lisp
+ checkViewport viewport =>
+ sendSF(VIEW,viewport.perspective.hitherPlane)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+ modifyPointData(viewport,anIndex,aPoint) ==
+ (n := dimension aPoint) < 3 => error "The point should have dimension of at least 3"
+ viewport.space3D := modifyPointData(viewport.space3D,anIndex,aPoint)
+ (key(viewport) ^= 0$I) =>
+ sendI(VIEW,typeVIEW3D)$Lisp
+ sendI(VIEW,modifyPOINT)$Lisp
+ checkViewport viewport =>
+ sendI(VIEW,anIndex)$Lisp
+ sendSF(VIEW,xCoord aPoint)$Lisp
+ sendSF(VIEW,yCoord aPoint)$Lisp
+ sendSF(VIEW,zCoord aPoint)$Lisp
+ if (n = 3) then sendSF(VIEW,convert(0.5)@SF)$Lisp
+ else sendSF(VIEW,color aPoint)$Lisp
+ getI(VIEW)$Lisp -- acknowledge
+
+-- print viewport ==
+-- (key(viewport) ^= 0$I) =>
+-- sendI(VIEW,typeVIEW3D)$Lisp
+-- sendI(VIEW,printViewport)$Lisp
+-- checkViewport viewport =>
+-- getI(VIEW)$Lisp -- acknowledge
+
+@
+\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>>
+
+-- this is a new graphics package and does not depend on any of the
+-- current plotting stuff
+-- so it is best to run it in a minimum system (like spadsys)
+
+<<domain VIEW3D ThreeDimensionalViewport>>
+@
+\eject
+\begin{thebibliography}{99}
+\bibitem{1} nothing
+\end{thebibliography}
+\end{document}