File: SVViewerImpl.mesa
Author: Eric Bier on July 2, 1983 5:03 pm
Copyright © 1984 by Xerox Corporation. All rights reserved.
Last edited by Bier on January 28, 1987 11:44:13 pm PST
Contents: Code to create a solid viewer. Calls SVViewerTool to make the container and adds menus at the top. The 3D part of the solid viewer is a new viewer of class $SolidWindow. The paint proc for a $SolidWindow is defined herein.
DIRECTORY
BitMap3d, CoordSys, FS, Icons, Imager, Menus, Rope, SV2d, SV3d, SVDrawMonitor, SVError, SVInterfaceTypes, SVMenus, SVModelTypes, SVScene, SVSceneTypes, SVUserInput, SVViewer, SVViewerTool, SVViewerUser, TIPUser, ViewerClasses, ViewerOps;
SVViewerImpl: CEDAR PROGRAM
IMPORTS BitMap3d, CoordSys, FS, Icons, Imager, Menus, Rope, SVError, SVMenus, SVScene, SVUserInput, SVViewerTool, SVViewerUser, TIPUser, ViewerOps
EXPORTS SVViewer
SHARES ViewerClasses =
BEGIN
Camera: TYPE = SVModelTypes.Camera;
CoordSystem: TYPE = SVModelTypes.CoordSystem;
EditToolData: TYPE = SVInterfaceTypes.EditToolData;
FileCamera: TYPE = SVSceneTypes.FileCamera;
MouseButton: TYPE = Menus.MouseButton;
Plane: TYPE = SV3d.Plane;
Point2d: TYPE = SV2d.Point2d;
Scene: TYPE = SVSceneTypes.Scene;
Viewer: TYPE = ViewerClasses.Viewer;
ViewerToolData: TYPE = REF ViewerToolDataObj;
ViewerToolDataObj: TYPE = SVInterfaceTypes.ViewerToolDataObj;
SolidPaint: SAFE PROC [self: Viewer, context: Imager.Context, whatChanged: REF ANY, clear: BOOL] RETURNS [quit: BOOLFALSE] = TRUSTED {
ViewerClasses.PaintProc
whatChanged is a ViewerToolData. self is a ViewerPicture.
viewerToolData: ViewerToolData;
IF whatChanged = NIL THEN { --we are being called by Window Manager
viewerToolData ← NARROW[self.data];
SVViewerUser.PlaceOrigin[self];
SVViewerUser.ResizeBitMaps[self];
Imager.SetFont[context, viewerToolData.editToolData.font];
SVViewerUser.EraseAndDrawSceneEtc[context, viewerToolData];
}
ELSE {
proc: PROC [Imager.Context];
viewerToolData ← NARROW[whatChanged];
proc ← viewerToolData.proc;
Imager.SetFont[context, viewerToolData.editToolData.font];
proc[context];
RETURN};
};
Init: PROC = {
solidWindowClass: ViewerClasses.ViewerClass;
solidWindowClass ←
NEW[ViewerClasses.ViewerClassRec ← [
paint: SolidPaint,
notify: SVUserInput.InputNotify,
tipTable: TIPUser.InstantiateNewTIPTable["SolidViews.TIP"]
]];
ViewerOps.RegisterViewerClass[$SolidWindow, solidWindowClass];
};
CreateViewerTool: PUBLIC PROC [parentData: REF ANY, scene: Scene, iconic: BOOL, paint: BOOL, workingDirectory: Rope.ROPE] RETURNS [viewerToolData: ViewerToolData, viewerPicture: Viewer] = {
parent is the EditTool
Create the Container and the top menu which looks like this:
Clear, Reset, Get, Store, Save, Split, Erase, Raycast, Stop, Aray, Press, Extend, Move
#BBox #Scene #Coords #Point #Cross #Color #B&W Coords
screenCS, worldCS: CoordSystem;
success: BOOL;
fileCamera: FileCamera;
editToolData: EditToolData;
iconFileName: Rope.ROPE;
windowMenu: Menus.Menu;
viewerToolData ← NEW[ViewerToolDataObj];
windowMenu ← Menus.CreateMenu[1];
viewerToolData.editToolData ← NARROW[parentData];
viewerToolData.scene ← scene;
editToolData ← NARROW[parentData];
iconFileName ← Rope.Concat[editToolData.originalWorkingDirectory, "SolidViews.icons"];
Construct the outer container.
viewerToolData.outer ← SVViewerTool.Create[
info: [
name: Rope.Concat["Solid Scene: ", viewerToolData.scene.name],
menu: windowMenu,
data: viewerToolData,
iconic: TRUE,
column: left,
scrollable: FALSE,
icon: Icons.NewIconFromFile[iconFileName, 0]
],
paint: FALSE];
Find the current scene.
screenCS ← CoordSys.CreateRoot["SCREEN"];
IF scene.cameraOrder # NIL THEN [fileCamera, ----] ← SVScene.FindFileCameraFromName[scene.cameraOrder.first,
viewerToolData.scene]
ELSE {
[fileCamera, success] ← SVScene.FindFileCameraFromName["Front",
viewerToolData.scene];
IF NOT success THEN ERROR;
};
worldCS ← scene.coordSysRoot;
viewerToolData.camera ← SVScene.CreateCamera[worldCS, screenCS, shaded];
SVScene.StuffCameraFromFileCamera[viewerToolData.camera, fileCamera, shaded];
viewerToolData.sceneStyleIndex ← 2; -- shaded
viewerToolData.mode ← cast;
viewerToolData.showCoordSys ← FALSE;
viewerToolData.doubleBuffer ← FALSE;
viewerToolData.altDC ← BitMap3d.GetAltDisplayContext[];
SVMenus.BuildControlPanel[viewerToolData, windowMenu, workingDirectory];
BuildPictureSection[viewerToolData];
viewerPicture ← viewerToolData.viewerPicture;
IF NOT iconic THEN ViewerOps.OpenIcon[icon: viewerToolData.outer, closeOthers: FALSE, bottom: FALSE, paint: TRUE];
};
BuildPictureSection: PRIVATE PROC [viewerToolData: ViewerToolData] = {
Create a SolidWindow which fills the bottom of the container
viewerToolData.viewerPicture ← ViewerOps.CreateViewer[
flavor: $SolidWindow,
info: [
parent: viewerToolData.outer,
wx: 0, wy: viewerToolData.height,
ww: viewerToolData.outer.ww,
wh: viewerToolData.outer.wh, -- only initial values for ww and wh. They are constrained below
data: viewerToolData, -- contains the current scene
scrollable: FALSE
]
];
SVViewerTool.ChildXBound[viewerToolData.outer, viewerToolData.viewerPicture];
SVViewerTool.ChildYBound[viewerToolData.outer, viewerToolData.viewerPicture];
viewerToolData.height ← viewerToolData.height + viewerToolData.viewerPicture.wh;
}; -- end of BuildDrawSection
ReloadTipTable: PUBLIC PROC [viewerToolData: ViewerToolData] = TRUSTED {
newTable: TIPUser.TIPTable;
editToolData: EditToolData ← NARROW[viewerToolData.editToolData];
solidviewer: ViewerClasses.Viewer;
bad: BOOLFALSE;
tableName, msg: Rope.ROPE;
SVError.AppendHerald["Reloading tip table...", begin];
tableName ← Rope.Concat[editToolData.originalWorkingDirectory, "Solidviews.TIP"];
newTable ← TIPUser.InstantiateNewTIPTable[tableName
! FS.Error => {
bad ← TRUE;
msg ← Rope.Concat["Cannot read TIP table file: ", tableName];
CONTINUE};
TIPUser.InvalidTable => {
bad ← TRUE;
msg ← Rope.Concat["Error(s) saved on TIP.Errors for: ", tableName];
CONTINUE}];
IF bad THEN {SVError.Append[msg, oneLiner]; RETURN};
SVError.AppendHerald["Done.", end];
IF newTable = NIL THEN ERROR;
solidviewer ← viewerToolData.viewerPicture;
solidviewer.tipTable ← newTable;
};
Init[];
END.